1.只提供一种递归的思路,从上到下解决问题,没有完全优化,会超时。
public class Solution {
public int coinChange(int[] coins, int amount) {
Arrays.sort(coins);//jdk降序排列
int len=coins.length;
int total=0,pos=len-1;
total=count(coins,pos,amount);
return total;
}
private int count(int[] coins,int pos,int amount){
if( amount<0 ){
return -1;
}
if(amount % coins[pos] == 0 ){
return amount/coins[pos];
}
int tmp=-2,min=0x10000000;
for(int i=pos;i>=0;i-- ){
int ct=count(coins,i,amount-coins[i]);
if(ct>=0 && ct<min){
min=ct;
}
}
if(min != 0x10000000 ){
tmp+=min+2;
}
return tmp+1;
}
}
下面是采用动态规划,从底到上的思想。
public class Solution {
public int coinChange(int[] coins, int amount) {
if(amount==0)
return 0;
int[] min=new int[amount+1];
Arrays.sort(coins);
int len=coins.length;
// for(int i=0;i<len;i++){
// min[coins[i]]=1;
// }
for(int i=coins[0];i<=amount;i++ ){
int t = 0x10000000;
for(int j=len-1;j>=0;j--){
if(i-coins[j] == 0){
min[i]=1;
break;
}
else if( i-coins[j] >0 && min[i-coins[j]]>0 && min[i-coins[j]] <t){
t=min[i-coins[j]];
}
}
if(t!=0x10000000)
min[i]=t+1;
}
if(min[amount] == 0)
return -1;
return min[amount];
}
}