凑零钱算法-dp表 java实现

public int coinChange(int[] coins, int amount) {
        //初始化dp表
        int[] dp = new int[amount+1];
        //因为是求最小值,所以默认值是一个无穷大,对于本题,amount+1也是无穷大
        for (int i = 0; i < amount+1; i++) {
            dp[i]=amount+1;
        }
     //base case 最小的子问题
        dp[0]=0;
        
        //穷举所有潜在子问题,本题就是目标金额的子问题穷举
        for (int i = 0; i < dp.length; i++) {
            //每个子问题的可选列表
            for (int coin : coins) {
                //结束条件:目标金额-硬币面值
                if(i-coin<0) continue;
                //转移方程,1+子问题(花出去了一个币的机会,将当前问题转移到总金额-币面值的子问题)
                dp[i] = Math.min(dp[i], 1 + dp[i - coin]);
            }
        }
     //如果最终目标无解
        return (dp[amount] == amount + 1) ? -1 : dp[amount];
    }
 
 

 

posted @ 2021-03-08 11:14  karbon  阅读(287)  评论(0)    收藏  举报