leetcode 322 零钱兑换

╰+攻爆jí腚メ 2023-06-25 11:29 68阅读 0赞

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

示例 1:

输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:

输入: coins = [2], amount = 3
输出: -1
说明:
你可以认为每种硬币的数量是无限的。

思路: 刚开始每次想着,取最大,再递归深入,但是有些case不能通过。用了贪心,每次贪最大,但是不能组成整数。

证明局部最优,不能解决,必须是全局最优才行。所以,表达式为

  1. fn = { 0,n =0;Math.min(f(n-c)+1) c={conis} }

dp先初始化,amount + 1. 为什么?因为,Math.min(dp[i],dp[i-c]+1).dp[i]可能为0,取最小即为0.所以结果不对。

但是dp[0]必须初始化为0.

  1. class Solution {
  2. public int coinChange(int[] coins, int amount) {
  3. if (coins == null || coins.length == 0)
  4. return -1;
  5. if (amount == 0) return 0;
  6. int[] dp = new int[amount+1];
  7. Arrays.fill(dp,amount+1);
  8. dp[0] = 0;
  9. for (int i = 1;i <= amount;i++) {
  10. for (int c:coins) {
  11. if (c > i) {
  12. continue;
  13. } else {
  14. dp[i] = Math.min(dp[i],dp[i-c]+1);
  15. }
  16. }
  17. }
  18. return dp[amount] == amount+1?-1:dp[amount];
  19. }
  20. }

发表评论

表情:
评论列表 (有 0 条评论,68人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode 322 零钱兑换

    给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1

    相关 leetcode322 零钱兑换

    给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1

    相关 322. 零钱兑换

    > 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 >

    相关 Leetcode 322. 零钱兑换

    题目重述 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何

    相关 LeetCode-322. 零钱兑换

    [322. 零钱兑换][322.] 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币