322. 零钱兑换

题目

322. 零钱兑换
官方题解

爆搜

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
    int res = INT_MAX;

    void dfs(vector<int>& coins, int amount, int u, int cnt) {
        if (u == coins.size()) {
            if (!amount) {
                res = min(res, cnt);
                return;
            }
            return;
        }

        for (int i = 0; i * coins[u] <= amount; i ++) {
            if (cnt + i >= res) return;
            dfs(coins, amount - i * coins[u], u + 1, cnt + i);
        }
    }

    int coinChange(vector<int>& coins, int amount) {
        dfs(coins, amount, 0, 0);
        if (res == INT_MAX) return -1;
        return res;
    }
};

动态规划

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount + 1, INT_MAX);
        dp[0] = 0;
        for (int i = 1; i <= amount; i ++) {
            for (int j = 0; j < coins.size(); j ++) {
                if (i - coins[j] >= 0 && dp[i - coins[j]] != INT_MAX) {
                    dp[i] = min(dp[i], dp[i - coins[j]] + 1);
                }
            }
        }
        if (dp[amount] == INT_MAX) return -1;
        return dp[amount];
    }
};

贪心 + 回溯

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
    int res = INT_MAX;

    void dfs(vector<int>& coins, int amount, int u, int cnt) {
        if (u == coins.size()) {
            if (!amount) {
                res = min(res, cnt);
                return;
            }
            return;
        }

        for (int i = amount / coins[u]; i >= 0; i --) {
            if (cnt + i >= res) return;
            dfs(coins, amount - i * coins[u], u + 1, cnt + i);
        }
    }

    int coinChange(vector<int>& coins, int amount) {
        sort(coins.begin(), coins.end(), greater<int>());
        dfs(coins, amount, 0, 0);
        if (res == INT_MAX) return -1;
        return res;
    }
};