LeetCode322零錢兌換2018_1207_1624
阿新 • • 發佈:2018-12-31
dp[i]代表要湊齊總數為i的錢所需要的最少硬幣數
dp[i]=min(dp[i]-coins[j])+1 for all j
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int min=0x7fffffff;
vector<int> dp(amount+1,0);
dp[0]=0;
dp[1]=1;
for(int i=1;i<=amount;i++){
for (int j=0;j<coins.size();j++){
if(i-coins[j]>=0&&dp[i-coins[j]]<amount+1){
min=dp[i-coins[j]];
}
}
dp[i]=min+1;
min=0x7fffffff;
}
return dp[amount];
}
};
這裡面考慮到有面值為1的硬幣的情況
測試用例
不通過
dp[1]!=1,沒有面值為1的硬幣
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int min=0x7fffffff;
vector<int> dp(amount+1,amount+1); //amount+1為不可能需要的次數,湊不出時作為判斷條件
dp[0]=0;
// dp[1]=1;
for(int i=1;i<=amount;i++){
for (int j=0;j<coins.size();j++){
if(i-coins[j]>=0&&dp[i-coins[j]]<amount+1){ //如果i-coins[j]能夠湊出來
if(dp[i-coins[j]]<min) min=dp[i-coins[j]];
}
}
if(min!=0x7fffffff) dp[i]=min+1; //如果能夠湊出來
min=0x7fffffff;
}
return dp[amount]==amount+1?-1:dp[amount];
}
};