LeetCode HOT100 - 零钱兑换
背包问题
实际上依然是从 dp 的角度来考虑
令 dp[i] 表示达到 i 的最小花费
那么考虑 dp[i] 怎么来,那当然是遍历 dp[i - j],取最小值 +1
1 <= coins.length <= 12 很小,所以每次都直接遍历即可
硬币取无限次就在于每一轮的更新中了,以为比如 3 = 1 + 1 + 1
相当于 1 被用了三次
class Solution {
public:
int coinChange(vector<int>& a, int n) {
vector<int> dp(n + 1, INT_MAX);
dp[0] = 0;
for (int i = 1; i <= n; i++) {
for (int j : a) {
if (i - j < 0 || dp[i - j] == INT_MAX) continue;
dp[i] = min(dp[i - j] + 1, dp[i]);
}
}
return dp[n] == INT_MAX ? -1 : dp[n];
}
};

浙公网安备 33010602011771号