LeetCode 322
https://leetcode.cn/problems/coin-change/description/
难度:中等
完全背包题目。与 0-1 背包的不同是转移方程中右边的 i 变成 i + 1,说明可以重复取同一个元素。
f[i + 1][c] = min(f[i][c], f[i + 1][c - w[i]] + v[i])
时间复杂度:O(n⋅amount),其中 n 为 coins 的长度。
空间复杂度:O(n⋅amount)。
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int n = coins.size();
vector f(n + 1, vector<int>(amount + 1, INT_MAX / 2)); // 除 2 防止下面 + 1 溢出
f[0][0] = 0;
for (int i = 0; i < n; i++) {
for (int c = 0; c <= amount; c++) {
if (c < coins[i]) {
f[i + 1][c] = f[i][c];
} else {
f[i + 1][c] = min(f[i][c], f[i + 1][c - coins[i]] + 1);
}
}
}
int ans = f[n][amount];
return ans < INT_MAX / 2 ? ans : -1;
}
};