C++——0-1背包(0-1 knapsack)上

问题描述

       给定 n 件物品,物品的重量为 w[i],物品的价值为 v[i]。现挑选物品放入背包中,假定背包能承受的最大重量为 W,问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大?

       简单来说就是给一个空间有限的背包和一些有价值和能占空间的物品,问这个空间有限的背包怎么装才能装的东西的价值最高。


解决方法

       我们可以用动态规划来解决这类问题。

       我们知道动态规划的解题步骤,笼统的可以分为问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成。

       首先我们得定义一些需要用到的变量:
       w[i]——每个物品的重量
       v[i[——每个物品的价值
       W——背包可装物品重量(装了物品剩余重量)
       n——物品数目

       我们先给定几个数值,以便分析:

编号123
物品重量234
价值345

       我们给出三组数据,w[i]={2,3,4},v[i]={3,4,5},制定背包可装重量为5
       根据动态规划,我们制定装入背包的方案。
       我们制定背包重量从0开始,装入的物品也从0开始,如下表所示
1-1
       横轴0-5表示W(背包总重量),竖轴0-3表示编号。

       1️⃣我们从0号物品出发,可以知道,从0号物品出发的话,0号物品是不存在的,所以无论背包多大,装的物品价值都是0。
在这里插入图片描述
       2️⃣同样的道理,背包可装重量为0,什么物品都不能装下,所以物品价值也是0。
在这里插入图片描述
       3️⃣接下来看第一个物品(w[1]=2,v[1]=3)
       当背包可装重量为1时,1<w[1],所以不能装进一号物品,价值为0。
       当背包可装重量为2时,2=w[1],可以装入,价值为3。
       当背包可装重量为3时,3>w[1],可以装入,装入后,背包可装重量剩余3-2=1,因为此时只有一号物品,没有其他号,所以总价值为1。
       以此类推,可以得出第一件物品各种重量总价值如图所示:
在这里插入图片描述

       4️⃣接下来看第二个物品(w[2]=3,v[2]=4)
       当背包可装重量为1时,1<w[2],所以不能装进二号物品,这时候从二号物品退到一号物品考虑,1<w[1],所以也不能装进一号物品,价值为0。

       当背包可装重量为2时,2<w[2],所以不能装进二号物品,这时候从二号物品退到一号物品考虑,2=w[1],可以装入,所以总价值为3。

       当背包可装重量为3时,3=w[2],所以能装进二号物品,但这时候就出现了两种情况,我们需要分类讨论:
       ①装入:因为3=w[2],所以能装进二号物品,装入后,背包剩余总重量为3-3=0,根据之前所填可知,背包不可以再装入物品,所以总价值为4。
       ②不装入:虽然3=w[2],可以装进二号物品,但是我们选择不装入二号物品,这时候从二号物品退到一号物品考虑,3>w[1],所以能装进一号物品,价值为3,剩余背包可装入重量为3-2=1,这时候从一号物品退到0号物品考虑,根据上面数据可知,0号物品的价值为0,综上得出不装入最大价值为3。
       综上后比较得出,装入二号物品总价值比不装入二号物品的总价值高,所以选择装入二号物品,最终总价值为7。

       以此类推,可以得出第二件物品各种重量总价值如图所示:
在这里插入图片描述

       5️⃣接下来看第三个物品(w[3]=4,v[3]=5)

       当背包可装重量为1时,1<w[3],所以不能装进三号物品,这时候从三号物品退到二号物品考虑,1<w[2],所以也不能装进二号物品,这时候从二号物品退到一号物品,1<w[1],所以也不能装进一号物品,价值为0。

       当背包可装重量为2时,2<w[3],所以不能装进三号物品,这时候从三号物品退到二号物品考虑,2<w[2],所以也不能装进二号物品,这时候从二号物品退到一号物品,2=w[1],价值为3。

       当背包可装重量为3时,3<w[3],所以不能装进三号物品,这时候从三号物品退到二号物品考虑,3=w[2],这是可以装入,也可以不装,根据前面的计算,可以得出最大价值为4

       当背包可装重量为4时,4=w[3],所以可以选择装进三号物品,这时候最大价值为5,当我们选择不装入时从三号物品退到二号物品考虑,4>w[2],这是可以装入,也可以不装,根据前面的计算,可以得出最大价值为4,两者相比较,最大价值为5。

       以此类推,可以得出第三件物品各种重量总价值如图所示:

在这里插入图片描述


练习

当w[i]={2,3,4,5,9},v[i]={3,4,5,8,10},问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大?

解答

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值