力扣518零钱兑换
从一组硬币里选择一些硬币出来组成amount面额的金钱=>经典的动态规划问题
由此可以看出是:有选择的组合问题=>背包问题
又因为是无限个数=>完全背包问题
AC代码
// 未优化版
class Solution {
public:
int change(int amount, vector<int>& coins) {
int n = coins.size();
vector<vector<int>> f(n + 1, vector<int>(amount + 1));
for (int i = 0; i <= n; i ++ ) f[i][0] = 1;
// 等价于f[0][0] = 1;
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= amount; j ++ )
{
f[i][j] = f[i - 1][j];
if (j >= coins[i - 1]) f[i][j] += f[i][j - coins[i - 1]];
}
return f[n][amount];
}
};
优化版本
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> f(amount + 1);
f[0] = 1;
for (auto x : coins)
for (int j = x; j <= amount; j ++ )
f[j] += f[j - x];
return f[amount];
}
};