zoukankan      html  css  js  c++  java
  • 零钱兑换 背包问题

    前言:

      背包问题:

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

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

    题目:

           

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

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

           放空

        

      

  • 相关阅读:
    影像数据的裁切和保存(源代码)
    C#读取EXIF信息类多
    C#里到底怎么样才能嵌入汇编?
    using和回收资源
    两个由栈组成的队列和两个由队列组成的栈
    C解两道题
    Inside WUAIntroduction
    轮子和做轮子
    致曾经整过的"框架"
    C#动态分配一维数组和二维数组函数
  • 原文地址:https://www.cnblogs.com/misscai/p/15010553.html
Copyright © 2011-2022 走看看