【LeetCode-518】零钱兑换 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
解答
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount + 1, 0);
dp[0] = 1; // 剩余金额能到0,本次次数+1
for (int i : coins) {
for (int j = i; j <= amount; j++) {
dp[j] += dp[j - i];
}
}
return dp[amount];
}
};
重点思路
本题为经典的完全背包(物品可以重复取用)中的组合问题(不关心取用的顺序)。所以外层循环为物品重量,内层循环为背包容量。