零钱兑换-动态规划

50 阅读1分钟
// 零钱兑换,最少硬币数,动态规划  
// 输入:coins = [1, 2, 5], amount = 11  
// 输出:3  
// 解释:11 = 5 + 5 + 1  
public static int coinChange(int[] coins,int amount){  
    int max=amount+1;  
    // 凑成amount的最小硬币数状态  
    int[] dp=new int[amount+1];  
    Arrays.fill(dp,max);  
    // amount=0时为0  
    dp[0]=0;  
    // 控制凑成0-amount所需硬币数  
    for (int i = 1; i <=amount ; i++) {  
        // 选取硬币的面值  
        for (int j = 0; j <coins.length ; j++) {  
            // 面值小于当前amount才可以被选取  
            if(coins[j]<=i){  
                // 不选当前硬币面额coins[j]时为dp[i]  
                // 选取当前面额时由上一个可以选取的状态dp[i-coins[j]]加上当前选取硬币数1  
                dp[i]=Math.min(dp[i],dp[i-coins[j]]+1);  
            }  
        }  
    }  

    return dp[amount]>amount?-1:dp[amount];  
}