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件物品,所以需要顺序。

发布了37 篇原创文章 · 获赞 3 · 访问量 1172

猜你喜欢

转载自blog.csdn.net/qq_45721778/article/details/105146641