学习要点
- 理解完全背包思想
- 理解一维数组的解法
题目链接
题目描述

解法:二维数组
cpp
class Solution {
public:
int change(int amount, vector<int>& coins) {
if (amount == 0)
return 1;
// dp[i][j] 0-i中任意无限取凑成j的最大方式
int n = coins.size();
vector<vector<uint64_t >> dp(n, vector<uint64_t>(amount + 1, 0));
// 初始化
for (int i = 1; i <= amount; i++) {
if (i % coins[0] == 0) {
dp[0][i] = 1;
}
}
for (int i = 0; i < n; i++) {
dp[i][0] = 1;
}
// 开始动归
for (int i = 1; i < n; i++) {
for (int j = 1; j <= amount; j++) {
if (coins[i] > j) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = dp[i - 1][j] + dp[i][j - coins[i]];
}
}
}
return dp[n - 1][amount];
}
};
解法:一维数组
cpp
class Solution {
public:
int change(int amount, vector<int>& coins) {
// 完全背包组合问题
if(amount == 0) return 1;
int n = coins.size();
vector<uint64_t> dp(amount+1,0);
// dp[j] = dp[j]上一层 + dp[j-coins[i]]这一层
dp[0] = 1;
for(int i = 0;i<n;i++)
{
for(int j = coins[i];j<=amount;j++)
{
dp[j] += dp[j-coins[i]];
}
}
return dp[amount];
}
};