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]; } }