leetcode 322. Coin Change | 322. 零钱兑换(动态规划)

向右看齐 2022-10-20 00:55 349阅读 0赞

题目

https://leetcode.com/problems/coin-change/
在这里插入图片描述

题解

也许是第一次在没看答案的情况下写的动态规划…

第一反应是,这题不是广义背包吗?想了一下,不是,因为广义背包的约束是小于等于容量,而本题的约束是等于容量。

第二反应是,这题有点像 dp 的累加和啊。把一个数 a 可以拆成 b + c,这样就划分成了子问题。

第三反应是,拆分的过程有点类似于 线段树,可以用来方便理解,不过思路不能照搬。

结合这三个想法,确定了 dp[] 表示强制包含当前元素情况下,需要的最小硬币数量,然后就开始草稿尝试 dp 了。写了几行之后,发现思路可行,搞定。
在这里插入图片描述

  1. class Solution {
  2. public int coinChange(int[] coins, int amount) {
  3. Arrays.sort(coins);
  4. int[] dp = new int[amount + 1]; // 强制包含当前元素情况下,需要的最小硬币数量
  5. for (int i = 1; i < amount + 1; i++) {
  6. int minCount = Integer.MAX_VALUE;
  7. for (int coin : coins) {
  8. if (coin >= i) {
  9. if (coin == i) minCount = 1;
  10. break;
  11. }
  12. if (dp[i - coin] != Integer.MAX_VALUE)
  13. minCount = Math.min(minCount, 1 + dp[i - coin]);
  14. // minCount = Math.min(minCount, dp[coin] + dp[i - coin]);
  15. }
  16. dp[i] = minCount;
  17. }
  18. if (dp[amount] == Integer.MAX_VALUE) return -1;
  19. else return dp[amount];
  20. }
  21. }

在这里插入图片描述

发表评论

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

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

相关阅读

    相关 Leetcode 322. 零钱兑换

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

    相关 LeetCode-322. 零钱兑换

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