零钱兑换
原题在这里:
经典题目就不多说题意了
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】

浙公网安备 33010602011771号