322. 零钱兑换
class Solution {
public:
int coinChange(vector<int>& coins, int m) {
vector<int>f(m + 1, 1e8);
f[0]= 0;
for(auto v: coins)
for(int j = v; j <= m; j ++) {
f[j] = min(f[j], f[j - v] + 1);
}
if(f[m] == 1e8) return -1;
return f[m];
}
};
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount + 1, INT_MAX)
dp[0] = 0
for (int i = 0
for (int j = coins[i]
if (dp[j - coins[i]] != INT_MAX) { // 如果dp[j - coins[i]]是初始值则跳过
dp[j] = min(dp[j - coins[i]] + 1, dp[j])
}
}
}
if (dp[amount] == INT_MAX) return -1
return dp[amount]
}
}
518. 零钱兑换 II
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> f(amount + 1);
f[0] = 1;
for(auto v : coins) {
for(int j = v; j <= amount; j ++)
最终答案为 f(amount)f(amount)。
f[j] += f[j - v];
}
return f[amount];
}
};
//状态计算: 把最后一种硬币拿掉:f[i][j] = f[i-1][j-k*coins[i]], 这样的话时间复杂度是O(n^3)
//优化: f[i][j] = f[i-1][j] + f[i-1][j-coins[i]] + f[i-1][j-2*coins[i]] + ...
// f[i][j-coins[i]] = f[i-1][j-coins[i]] + f[i-1][j-2*coins[i]] + ...
// f[i][j] = f[i-1][j] + f[i][j-coins[i]]
// f[j] = f[j] + f[j-coins[i]]