01背包逆序和完全背包顺序的问题

01背包和完全背包应该是背包问题的根本了,最近在学的时候发现01背包是逆序,完全背包是顺序,下午就对他们的原理进行了一下探究,如下。
 
01背包有两种写法
二维

f[i][j]=max(f[i-1][j],f[i-1][j-weight[i]]+value[i]);

一维

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

经过数据验证,我发现一维数组一定要逆序,二维数组逆序顺序都可以,原理如下
先看一下二维数组的推导过程
在这里插入图片描述
 

01背包问题里面,第i件物品所能带来的价值与第i-1件物品息息相关

f[i][j]=max(f[i-1][j],f[i-1][j-weight[i]]+value[i]);

如果是顺序,二维数组有f[i][j],表示前i件物品,总质量不超过j的最大价值,有i控制次序没有问题,不过一维数组f[j]里面的j变量代表代表总质量不超过能产生的最大价值,没有前i件物品的限制,f[j-w[i]]如果采取顺序求值的话,就会先更新为第i-1次所求的f[j-w[i]],再更新为第i次循环时的数据,本来

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

是应该由第i-1个物品的价值所求得,现在却变成了第i件物品价值所求得,数据产生了错误,所以需要用逆序,先求后面的i所产生的价值,再求前面的i所产生的价值,以防止数据被修改而产生的干扰

听到这里,是不是很多小伙伴都懵了,心想这是什么鬼畜
那我再举一个例子----数塔
在这里插入图片描述
这个你应该学过
题目是要求从上向下找一个路径,使得数据总和最大,最简单的方法就是逆序,从下往上,去求下一层的每一个和上一层相邻两个的和,比较大小
那我们如果不另外使用数组,采取顺序的话,那是不是每一行的数据都会被修改,那么下一行再次使用的时候,就得到了修改过的数据,而我们使用逆序,就可以保证每个数据只被使用一次,(这应该是背包问题最经常看到的一句话了,然而并没有人解释他的意思,我感觉就和数塔类似)
 
 
完全背包

f[i][v]=max{f[i-1][v-k*w[i]]+k*c[i],l0<=k*w[i]<=v}.

而完全背包问题中,物品个数无限制,前i次物品所带来的价值不止是取或者不取第i-1件物品,也可以取第i件物品,这就导致第i件物品带来的价值有三种可能,取第i-1件物品,不取第i-1件物品,取第i件物品,所以需要顺序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值