零钱兑换

原题在这里

  经典题目就不多说题意了

1.记忆化广搜

code:

class Solution
{
    struct ii
    {
        int x, y;
        ii(int a, int b) : x(a), y(b) {}
        friend bool operator<(ii a, ii b)
        {
            return a.y > b.y;
        }
    };

public:
    int coinChange(vector<int> &coins, int amount)
    {
        priority_queue<ii> q;
        q.push({amount, 0});
        vector<bool> vis(amount + 1, false);
        int l = coins.size();
        while (q.size())
        {
            ii n = q.top();
            q.pop();
            if (vis[n.x])
                continue;
            vis[n.x] = true;
            if (n.x == 0)
                return n.y;
            for (int i = l - 1; i >= 0; --i)
                if (n.x >= coins[i])
                    q.push({n.x - coins[i], n.y + 1});
        }
        return -1;
    }
};

2.效率肯定更好的DP

因为很直观简洁,一看就懂(我还是想都没想)。

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 - coins[j]] + 1, dp[i]);
        if (dp[amount] == INT_MAX)
            return -1;
        return dp[amount];
    }
};

 

【Over】

posted @ 2022-03-30 20:29  Renhr  阅读(39)  评论(0)    收藏  举报