零钱兑换 背包问题

前言:

  背包问题:

    给定一组物品,每种物品都有自己的重量和价格,

    在限定的总重量内,我们如何选择,才能使得物品的总价格最高

题目:

       

 思路: 转移方程不太好理解

  1 初始化dp数组为10001 dp[0] = 0

  2 转移方程 dp[j] = min(dp[j],dp[j - coin] + 1)

  3 dp[amount] 值如果是10001 返回-1 

  外层遍历物品

  内层遍历背包,背包下标从物品开始


(一)代码

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount + 1];
        //因为amount 0 <= amount <= 10的4次方,初始dp数组都为10001
        Arrays.fill(dp, 10001);
        //dp[0] = 0
        dp[0] = 0;

        //外层循环遍历物品
        //内层循环遍历背包,背包下标从物品开始
        //硬币面值
        for(int coin : coins){
            //总金额
            for(int j = coin; j < amount + 1; j++){
                //dp[j] = min(dp[j], dp[j - coin] + 1)
                //当前填满容量j最少需要的硬币 =
                //min( 之前填满容量j最少需要的硬币, 填满容量 j - coin 需要的硬币 + 1个当前硬币)
                dp[j] = Math.min(dp[j], dp[j - coin] + 1);
            }
        }
        return dp[amount] != 10001 ? dp[amount] : -1;
    }
}

       放空

    

  

原文地址:https://www.cnblogs.com/misscai/p/15010553.html