c++:Dynamic Programming
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
if (amount == 0) return 0;
if (dict.find(amount) != dict.end()) {
return dict[amount];
}
int n = amount + 1;
for (auto &c : coins) {
int cnt = 0;
if (amount >= c) {
int amt = coinChange(coins, amount - c);
if (amt >= 0)
cnt = 1 + amt;
}
if (cnt > 0)
n = min(cnt, n);
}
int res = n == amount + 1 ? -1 : n;
dict[amount] = res;
return res;
}
private:
unordered_map<int, int> dict;
};
c++:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
if (amount == 0) return 0;
vector<int> dp(amount + 1, INT_MAX);
dp[0] = 0;
for (int a = 1; a <= amount; ++a) {
for (int i = 0; i < coins.size(); ++i) {
if (a >= coins[i] && dp[a - coins[i]] >=0) {
dp[a] = min(dp[a], 1 + dp[a - coins[i]]);
}
}
if (dp[a] == INT_MAX)
dp[a] = -1;
}
return dp[amount];
}
};
c++: Breadth First Search
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
if (amount == 0) return 0;
vector<int> value1(1,0);
vector<int> value2;
int step2amount = 0;
vector<bool> visited(amount + 1, false);
visited[0] = true;
while (value1.size() > 0) {
step2amount++;
for (auto &v : value1) {
for (auto &c : coins) {
int new_value = v + c;
if (new_value == amount)
return step2amount;
if ((new_value<amount) && (visited[new_value] == false)) {
visited[new_value] = true;
value2.push_back(new_value);
}
}//c
}//v
value1 = value2;
value2 = vector<int>();
}
return -1;
}
};
https://leetcode.com/discuss/83289/understand-recursive-solution-using-java-with-explanations
https://leetcode.com/discuss/89085/c-dp-solution
https://leetcode.com/discuss/76432/fast-python-bfs-solution