代码
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount + 1, 0<details>
dp[0] = 1;
for (int j = 0; j <= amount; ++j) {
for (int i = 0; i < coins.size(); ++i)
if (j >= coins[i]) { dp[j] += dp[j - coins[i]];
cout << "dp[" << j << "] += dp[" << j - coins[i] << "]" << endl;}
}
return dp[amount];
}
};
难点详解测试
以测试数据 5 【1,2,5】
为例
- 组合数,外层遍历coins(i)
dp[1] += dp[0] dp[2] += dp[1] dp[3] += dp[2] dp[4] += dp[3] dp[5] += dp[4] dp[2] += dp[0] dp[3] += dp[1] dp[4] += dp[2] dp[5] += dp[3] dp[5] += dp[0]
- 排列数,外层遍历amount(j)
dp[1] += dp[0] dp[2] += dp[1] dp[2] += dp[0] dp[3] += dp[2] dp[3] += dp[1] dp[4] += dp[3] dp[4] += dp[2] dp[5] += dp[4] dp[5] += dp[3] dp[5] += dp[0]