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];
    }
};
posted @ 2026-03-26 00:40  rdcamelot  阅读(18)  评论(0)    收藏  举报