#01背包是如何实现的。
刚接触01背包问题时,所有人都会跟你说01背包的核心在于做出最优选择,新手对于这个最优选择可能有些云里雾里,
因为这个最优选择的判断是十分抽象的。但计算机本质上只能进行简单的加减乘除,以及简单的判断。
其实这个最优路径是有迹可循的。
下面先看一段最常见的01背包问题的代码
int V[N],W[N]; //V表示价值,W表示重量 N是一个足够大的数
cin>>n>>m; //n表示有n个物品,m表示最大重量
for(int i=1;i<=n;i++). cin>>V[i]>>W[i];//输入每个物品的价值和重量
//下面开始正式处理01背包问题
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
{
f[i][j]=f[i-1][j];
if(j>=W[i])
f[i][j]=max(f[i][j],f[i-1][j-W[i]]+V[i]);
}
假设W={0,2,3,4,5}; V={0,3,4,5,6}
可以把这个二维数组想象成是一个表格,第0行先设定默认值为0
从第1行开始,j每次从0递增,当此时j小于最小那个物品的空间时,f[i][j]=f[i-1][j],相当于没取,直到j=2时,我们才能取到第一个物品,此时价值等于3,此后,因为i=1,所以后面的数只能不断取到V[1],所以第一行的数,在j=2之后,全为3.
到了下一行,此时开始有所不同,因为上一行的数不全为0,
比较的作用现在才开始显现。当j=3时,V=4,根据f[i-1][j-W[i]]+V[i]
可知,V=0+4=4,往后递推,当f[i-1][j-W[i]]>0
时,此时成为在原有价值上添加价值,由于i=2此时的价值还没有完全开发全面,这才有了后续的i=3,4…n,
总的来看,01背包问题是在一层一层摸索最省空间的最大价值,使选择最优解这个飘渺的问题实际化。
欢迎各位批评指正。