题目描述 零钱兑换 II
给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。
示例
输入: amount = 5, coins = [1, 2, 5]
输出: 4
解释: 有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
解题思路
动态规划,用滚动一维dp就好,不过要注意里面两个for循环位置不能换啊,别想错了,跟我一样傻兮兮的你就就完蛋了。
- DP定义:记dp[i]为凑成总金额i的组合数;
- DP初始:dp[0] = 1,dp[1, 2,....., i] = 0;
- DP更新:dp[i] = dp[i] + dp[i-coin];
代码
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> nums(amount+1, 0);
nums[0] = 1;
for(auto coin:coins ){
for(int j=coin;j<=amount;j++){
nums[j] += nums[j-coin];
}
}
return nums[amount];
}
};