Leetcode322-零钱兑换
题目链接:322. 零钱兑换 - 力扣(LeetCode)
这道题目使用动态规划
状态转移方程:
dp[j] = min(dp[j], dp[j-coins[i]]+1);
但是做这道题目遇到些小问题,这里提一下
1、一开始是将dp初始化为INT_MAX的。但提交会报错
int min(int a, int b){
return a >= b ? b : a;
}
int coinChange(int* coins, int coinsSize, int amount) {
int dp[amount+1];
for (int i = 0; i <= amount; i++) {
dp[i] = INT_MAX;
}
dp[0] = 0;
for (int i = 0; i < coinsSize; i++) {
for (int j = coins[i]; j <= amount; j++) {
if (j-coins[i] >= 0) {
dp[j] = min(dp[j], dp[j-coins[i]]+1);
}
}
}
if (dp[amount] == INT_MAX)
return -1;
else
return dp[amount];
}
报错截图
遂将dp初始化为amount,但只通过179 / 189,原因是amount为0时,答案错误
最后将dp初始化为amount+1,通过
int min(int a, int b){
return a >= b ? b : a;
}
int coinChange(int* coins, int coinsSize, int amount) {
int dp[amount+1];
for (int i = 0; i <= amount; i++) {
dp[i] = amount+1;
}
dp[0] = 0;
for (int i = 0; i < coinsSize; i++) {
for (int j = coins[i]; j <= amount; j++) {
if (j-coins[i] >= 0) {
dp[j] = min(dp[j], dp[j-coins[i]]+1);
}
}
}
if (dp[amount] == amount+1)
return -1;
else
return dp[amount];
}