322. Coin Change

来源:互联网 发布:网络实施方案 编辑:程序博客网 时间:2024/05/22 11:48

先贴个自己想的经过递归的方法,但依旧超时,大概能比对到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];}
0 0