如何理解背包问题

 

问题:

一个背包,承重为C。n个物品,每个物品有各自的重量和价值。如何选择将哪些物体放入背包中,使得物品总重量不超过背包承重且物品总价值最大?

问题抽象:

  已知:

      背包的maxWeight = C, 这里C=10

      物品的数量items = N, 这里N= 4

      物品的重量Values of items为 V[], 这里 V[]= {10, 40, 30, 50}

      物品的价值Weight of items 为 W[], 这里 = W[] = {5, 4, 6, 3}

  求解:

      满足条件的物品组合有很多,其中一些的总价值最大,即所求的结果maxValue,这里maxValue = k(N, C)

      maxValue所对应的组合 ,例如: 1,2,3 或 2,4,5,即表示将物品1,2,3或者2,4,5放入背包,总价值最大

 

    

思路分析:

  这是求解一定约束条件下(背包承重),多种组合里最优组合。可以采用动态规划的方法。

    动态规划的核心思想为:全局最优解中包含局部最优解。

      这里问题的规模应该为待放入背包中的物品的数量。

    动态规划的关键是:什么是问题的规模?已知较小规模问题的最优解,如何得到较大规模问题的最优解。

      如果我们已知了较小规模问题的最优解,如知道了物品数量为3时的最优解,k(3,j),和所有的K(3,1) K(3,2) K(3,3) 。。。K(3,j)  

      那么 k(4,j) = max{ k(3,j), k(3,j-w[4])+ v[4] }

        如何理解上面的关系式呢?

          关键是看第4个物品可不可放入包中,如果不放入包中最优解就还是k(3,j),

          如果放入包中,则原来的包中的重量必要存在多余w[4]重量的空间

    动态规划的状态,和状态转换方程

      k(i,j) = max{ k(i-1,j), k(i-1,j-w[i])+ v[i] } ( j >= v[i]))

      k(i,j) = k(i-1, j) ( j < v[i]))

       

算法过程示意:

 

如何得到最优的物品排列组合:

  定义一个s[N], 其中s[i]等于0或者1,,s[i]=0表示第i个物品不在排列中,反之在。

 

    

 

转载于:https://www.cnblogs.com/lya-nju/p/4428198.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值