今天是第40天刷leetcode,立个flag,打卡60天,如果做不到,完成一件评论区点赞最高的挑战。
算法挑战链接
518. 零钱兑换 IIhttps://leetcode.cn/problems/coin-change-ii/
第一想法
题目理解:相对于上一次做的零钱兑换,这一次的零钱是无数的,因此可以有更多的选择。
因为我是在看完 完全背包的资料后再来做题的,因此我看到题目就会首先先到使用完全背包来完成这道题目。资料在这里:完全背包理论
完全背包和0-1背包的区别在于遍历的顺序,因为可以无限使用,因此在一维数组中的0-1背包的遍历顺序中,先从遍历物品,然后遍历容量。但是容量的遍历必须得从大到小去遍历,因为每个物品只能使用一次的原因。在完全背包中,这个就必须得从小到大去遍历,因为可以多次使用。
还有一点需要注意的是,在0-1背包中,先遍历物品还是容量都是可以的,但是在完全背包中是有讲究的。先遍历物品在遍历容量是求的组合(重复的,但是顺序不同算一次),先遍历容量在遍历物品求的是排列(重复的,顺序不同算多次)。
这一道题求的是零钱的组合,是组合。因此是先遍历物品在遍历容量。
如果不知道动态规划五步曲,可以查看我前面的文章。
代码如下:
class Solution {
public int change(int amount, int[] coins) {
int dp[] = new int[amount + 1];
dp[0] = 1;
for (int i = 0; i < coins.length; i++) {
for (int j = coins[i]; j <= amount; j++) {
dp[j] += dp[j - coins[i]];
}
}
return dp[amount];
}
}
今日收获
学习也可以很有意思。