先贴个自己想的经过递归的方法,但依旧超时,大概能比对到30多个的时候超时
下面再贴个dp,
public class Solution {
public int coinChange(int[] coins, int amount) {
int[]s = coins;
Arrays.sort(s);
int o=coinMin(s,0,amount,0,s.length-1);
if(o==99999999){
return -1;
}else{
return o;
}
}
private int coinMin(int[] coins,int number,int amount,int curMoney,int j){
int min = 99999999;
int cha = amount - curMoney;
if(curMoney == amount){return number;}
else if(curMoney > amount) return 99999999;
else{
for(int i=j;i>=0;i--){
if(coins[i]>cha)continue;
min = Math.min(coinMin(coins,number+1,amount,curMoney+coins[i],i),min);
}
return min;
}
}
}
dp解法
public int coinChange(int[] coins, int amount) {
if(amount==0) return 0;
int[] dp = new int [amount+1];
dp[0]=0; // 没有硬币也是0
for(int i=1;i<=amount; i++)
dp[i]= Integer.MAX_VALUE;
for(int i=0; i<=amount; i++){
for(int coin: coins){
if(i+coin <=amount){
if(dp[i]==Integer.MAX_VALUE){
dp[i+coin] = dp[i+coin];
}else{
dp[i+coin] = Math.min(dp[i+coin], dp[i]+1);
}
}
}
}
if(dp[amount] >= Integer.MAX_VALUE)
return -1;
return dp[amount];
}