背包问题

基础背包

定义i为某个物品,v[i]表示物品价值,w[i]表示物品重量(从1开始)
有约束求和问题,使在规定重量下价值最大

参考网站:http://www.importnew.com/13072.html

很重要的代码!

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

该方程代表将第i个物品放入重量为 j 的背包, f[][] 表示最优化的价值
假设现在我们有三个物品,其属性分别为

  1. (2,3)重量为2,价值为3,下同
  2. (3,4)
  3. (4,5)

背包重量不大于6,求最大价值,首先初始化
f[0][j] 代表将第0个物体放入中 重量为 j 的背包里,显然其值均为0,因为没有东西放进去
f[i][0]表示将第i个物品放进重量为0的背包,显然放不进去,因此其值也为0

i物品 / 设定重量j01234567
000000000
1(2,3)0
2(3,4)0
3(4,5)0

接下来查找第一行,即对于物品1,看看哪个重量可以放进去

i物品 / 设定重量j01234567
000000000
1(2,3)00333333
2(3,4)0
3(4,5)0

可以看出只有当j>=2才会被放进去,这个j的取值是这么来的
首先看两种情况:

  1. 第i个物品不放进去,那么得到的价值和第i-1的情况一样, 即f[i][j]=f[i-1][j]
  2. 第i个物品放进去,那么首先要保证空间够,然后加上该物品的价值,即f[i-1][j-w[i]],也就是说前一个物品必须预留出当前物品的空间,保证能塞下。比如图表中的f[1][1],判定第一个物品能不能塞得下,要看第0个物品塞下后能不能剩下w[i]的空间(也就是设定的重量),根据之前的判定条件有f[i-1][j-w[i]]=f[0][1-3],等于0,因为对于f[][],已全部初始化为0。

现在在来看看这个3是怎么来的。f[1][2]要么等于f[0][2],不放进去;要么等于f[0][2-w[i]]+v[i],也就是f[0][0]+2,其代表的含义就是,我在0,0这个地方剩了正好w[i]的空间,新的物品可以进来,价值更新
然后就是单纯的比较了,所以在(1,2)有可以放下1物品的条件,所以价值就是3
接下来就是单纯的迭代了,最后的结果是

i物品 / 设定重量j01234567
000000000
1(2,3)00333333
2(3,4)00344777
3(4,5)00345779

最后的结果就是f[3][7],就是所有3个物品都考虑到的限制为7重量的最优解
验算:图表中f[3][7]=max{f[2][7],f[2][7-4]+5}=max{7,f[2][3]+5}=9
对的!

摸老黑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值