dp解法:
class Solution {
public:
int dp[1000000];
int coinChange(vector<int>& coins, int amount) {
for(int i=1;i<=amount;i++){
dp[i]=2000000000;
for(auto m:coins){
if(i-m>=0&&dp[i-m]+1<dp[i]){
dp[i]=dp[i-m]+1;
}
}
}
if(dp[amount]==2000000000)
return -1;
return dp[amount];
}
};
在评论里看到了dfs的解法,是蛮快的:
class Solution {
public:
int ans=2000000000;
void dfs(vector<int>& coins,int rest,int cnt,int idx){
if (idx < 0 || cnt + rest / coins[idx] >= ans)
return;
if(rest%coins[idx]==0){
ans=cnt + rest / coins[idx];
return;
}
for(int i=rest/coins[idx];i>=0;i--)
dfs(coins,rest-i*coins[idx],cnt+i,idx-1);
}
int coinChange(vector<int>& coins, int amount) {
sort(coins.begin(),coins.end());
dfs(coins,amount,0,coins.size()-1);
return ans==2000000000?-1:ans;
}
};