题目:
代码(首刷看解析 2024年2月28日):
class Solution {
public:
//动态规划
int coinChange(vector<int>& coins, int amount) {
// dp 初始化 TODO:dp[0] = 0
vector<int> dp(amount + 1, INT_MAX - 1);
dp[0] = 0;
// 遍历 先amount 再coins
for (int i = 0; i <= amount; ++i) {
for (int j = 0; j < coins.size(); ++j) {
if (i - coins[j] < 0) dp[i] = dp[i];
else dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
return dp[amount] == INT_MAX - 1 ? -1 : dp[amount];
// dp[i] = min(dp[i], dp[i - coins[j]] + 1)
// todo : if i - coins[i] < 0
}
};
代码(二刷看细节 2024年3月10日)
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
sort(coins.begin(), coins.end());
// dp 表示最少硬币数
int n = coins.size();
vector<int> dp(amount + 1, INT_MAX - 1);
dp[0] = 0;
//递推公式:dp[i] = dp[i - "当前硬币价值"] + 1, dp[i] 最小值
// 先 amount 再coins
for (int i = 1; i <= amount; ++i) {
for (int j = 0; j < n && coins[j] <= i; ++j) {
dp[i] = min(dp[i - coins[j]] + 1, dp[i]);
}
}
return dp[amount] == INT_MAX - 1 ? -1 : dp[amount];
}
};
代码(三刷debug on gpt 2024年7月18日 go)
func coinChange(coins []int, amount int) int {
// 1. 凑出总额为j的金币最小硬币数数为dp[j]
// 2. dp[j] = dp[j - coins[i]] + 1
dp := make([]int, amount+1)
for i,_ := range dp {
dp[i] = amount + 1
}
dp[0] = 0
sort.Ints(coins)
// 3. 先遍历
for i := 0; i < len(coins); i++ {
for j := 0; j <= amount; j++ {
if j-coins[i] >= 0 {
dp[j] = min(dp[j-coins[i]] + 1, dp[j])
}
}
}
if dp[amount] == amount + 1 {
return -1
}
return dp[amount]
}
func min(a,b int) int {
if a < b {
return a
}
return b
}