首页 > 其他分享 >背包问题——分组背包

背包问题——分组背包

时间:2022-11-29 17:46:22浏览次数:53  
标签:背包 max 不选 问题 01 分组 物品

分组背包

1.定义

分组背包,通俗的讲就是,给你N组物品,然后每一组你至多选择一个物品(也可以不选),每个物品都有自己的体积和价值,现在给你一个容里为M的背包,让你用这个背包装物品,使得物品价值总和最大.

2.讲解

其实就类似于01背包,对于一个物品有两种决策选或不选,但是分组背包是在01背包的基础上对物品进行了分组,并且每一组只能最多选择一个物品,所以我们不妨用01背包的思想去思考分组背包.

分析:我们设f[i][j]为当前考虑到了第i组物品,剩余容里为j的背包能装物品的最大价值,那么很容易想到我们需要去枚举第i组物品,考虑选哪一个物品时最优的(或者不选),状态转移方程就是i f ( j > = v [ i ] [ k ] ) f [ i ] [ j ] = m a x ( f [ i ] [ j ] , f [ i − 1 ] [ j − v [ i ] [ k ] ] + w [ i ] [ k ] ),v[i][k]和w[i][k]分别表示第i组物品中第k个物品的体积和价值

代码:

for(int i=1;i<=n;i++)
     for(int j=0;j<=m;j++)
      for(int k=1;k<=s[i];k++)//s[i]表示第i组物品的个数
       if(j>=v[i][k])//剩余的背包容量j大于第i组的第k个物品的体积 
       {
             f[i][j] = max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);
       }

这里我们还可以对空间进行优化,我们可以观察到,f[i][…]只会用到f[i-1][…]的值,所以数组的第一维的空间完全可以用滚动数组的方式处理掉,但是如何不影响状态转移呢,我们来看滚掉之后的状态转移方程,

f[j] = max(f[j],f[j-v[i][k]]+w[i][k]);

 

这里的max里面的f [ j ] 和 f [ j − v [ i ] [ k ] ] 其实是f [ i − 1 ] [ j ] 和 f [ i − 1 ] [ j − v [ i ] [ k ] ],而不是f [ i ] [ j ] 和 f [ i ] [ j − v [ i ] [ k ] ],所以我们需要对体积的遍历做一些修改,从大到小循环,如果还是从小到大循环的话,那么这里的f [ j ] 和 f [ j − v [ i ] [ k ] ] 的含义就有可能是f [ i ] [ j ] 和 f [ i ] [ j − v [ i ] [ k ] ],而不是我们需要的f [ i − 1 ] [ j ] 和 f [ i − 1 ] [ j − v [ i ] [ k ] ],可以模拟一下就明白了,只靠想的话有点抽象.

5743: 分组背包

 

标签:背包,max,不选,问题,01,分组,物品
From: https://www.cnblogs.com/jyssh/p/16936044.html

相关文章

  • 反转 (开关问题)
    [USACO07MAR]FaceTheRightWayG$N$头牛排成一列$1\leN\le5000$。每头牛或者向前或者向后。为了让所有牛都面向前方,农夫每次可以将$K$头连续的牛转向$1\leK......
  • TZOJ 2671: 01-package 01背包
    描述给定一个背包的容量k,给定n个物品的体积和价值,物品不可分割,将n个物品中选若干个物品放入背包,求背包内物品的最大价值总和,在价值总和最大的前提下求背包内的最小物品个......
  • ios中getTime()的兼容性问题
    时间格式为:2017-12-1212:00:00在苹果上获取时间戳有兼容性问题 需要转换成2017/12/1212:00:00 才可以正确获取到时间戳 vargetTime=function(time){varmyDate......
  • 测试分辨问题
    公司的swagger打开查看发生问题的接口在哪个归属  打开归属  通过其他地方多处对比正确参数,如项目的topoID:    多处对比发现正确的topoID应该是159316......
  • element-ui中el-table设置多选checkbox时,selection-change重复执行,以及选不中问题
    项目中使用了elementUI中el-table的选择框。在另外一个地方展示选中的行的数量。设置显示数量之后,选择框就无法选中,change事件执行两次。解决办法:给el-table设置row-key,并......
  • Echarts 解决饼图文字显示不全问题
    文本越界文本超出容器边界。可以调整center值。series:[{type:'pie',radius:['50%','65%'],lab......
  • gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/maste
    问题描述:gitee推送更新时,提示:remote:PoweredbyGITEE.COM[GNK-6.4]remote:error:GE007:Yourpushwouldpublishaprivateemailaddress.    remote:......
  • Xcode 14签名问题
    升级Xcode14版本后,打包报错,提示签名相关问题。1、对于cocoapods管理的三方库,设置不签名即可,podfile中,添加下述代码:`post_installdo|installer|installer.pods_projec......
  • ConvTranspose的output_padding问题
    当stride>=2时,反向传播,由dy,w得到dx的时候,dx的形状不唯一。例如input_shape(7,7)或者(8,8)在kernel(3,3)上,以stride=2进行卷积,最终得到的形状都是(3,3)。参考:https:/......
  • 漫途水库大坝安全监测系统,助力解决水库安全问题!
    我国是山川、河流众多的国家,河流湖泊密布,特别是中小河流,错综交互,如此众多的河流,极易造成洪水灾害,为防止洪水灾害,大力兴建水库。水库给人们带来便利的同时也存在巨大的安全......