题目
coin-change
2. 算法
* dp
* dp优化
* 哈希
3. 代码
* dp
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount + 1, amount + 1);
dp[0] = 0;
for (int i = 1; i <= amount; ++i) {
for (int j = 0; j < coins.size(); ++j) {
if (coins[j] <= i) {
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
};
* dp优化
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount + 1, INT_MAX);
dp[0] = 0;
return coinChangeDFS(coins, amount, dp);
}
int coinChangeDFS(vector<int> &coins, int amount, vector<int> &dp) {
if (amount < 0) return - 1;
if (dp[amount] != INT_MAX) return dp[amount];
for (int i = 0; i < coins.size(); ++i) {
int tmp = coinChangeDFS(coins, amount - coins[i], dp);
if (tmp >= 0) dp[amount] = min(dp[amount], tmp + 1);
}
return dp[amount] = dp[amount] == INT_MAX ? -1 : dp[amount];
}
};
* 哈希
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
unordered_map<int, int> dp;
dp[0] = 0;
return coinChangeDFS(coins, amount, dp);
}
int coinChangeDFS(vector<int> &coins, int amount, unordered_map<int, int> &dp) {
if (amount < 0) return - 1;
if (dp.find(amount) != dp.end()) return dp[amount];
int cur = INT_MAX;
for (int i = 0; i < coins.size(); ++i) {
int tmp = coinChangeDFS(coins, amount - coins[i], dp);
if (tmp >= 0) cur = min(cur, tmp + 1);
}
return dp[amount] = cur == INT_MAX ? -1 : cur;
}
};