01背包和完全背包入门理解

01背包的基本概念就是有一个容量为V的背包,现在有n件物品,每件物品所占空间为w[i],价值为v[i],问装哪些物品能使得背包中所装物品价值达到最大,01背包的特点就是每件物品只有一件,只放一次这也是他与完全背包的最大的区别,完全背包下面会有所讲解。01背包关键部分也就一个双重循环,下面我具体讲解一下这个双重循环,这也是我看了好久才有的理解。

我感觉举例子更容易理解这个代码,我假设有3件物品,背包的总容量为10,第一件物品所占空间为6,价值为300,第二件物品所占空间为5,价值为200第三件所占空间为4,价值为100,放第一件物品自己可以模拟一遍第二重循环可以让让f[10],f[9],f[8],f[7],f[6]的值都为300,然后开始放第二件物
品我上面五项的值都没有都没变,将放f[5]的值变为200,开始放第三个物品此时放f[10]的值变为400,此时我们已经看出来了,当装第一件物品和第三件物品的时候价值最大为400,看到此处相信你也有一定的了解了,就是每次更新的都是f[10]的值,也就是当前容量为最大的时候所能拥有的最大值是多少,则最后的最大值就是多少。f[j]就表示当前容量为j时背包的最大价值。

for(i=1;i<=n;i++)
	for(j=V;j>=w[i];j--)
		f[j]=max(f[j],f[j-w[i]]+v[i]);

下面该讲完全背包了,完全背包与01背包的最大区别就是,完全背包是有n种物品,每种物品可以取无线多件,每件物品所占空间为w[i],价值为v[i],问容量为V的的背包中放那些物品价值最大。完全背包也是一个双重循环,下面来具体讲解一下。

先举个例子来模拟一遍代码的运行过程,假设背包的总容量20,有3 15 400 5 200 10 500,表示有3种物品,后面6个数每两数表示这种物品中每件所占的空间,和价值。好下面拿这个例子来模拟一遍代码运行的过程先放第一种物品,内层循环让f[15],f[16],f[17],f[18],f[19],f[20]的值都变为400,然后开始放第二种物品,开始f[5]等于200,循环到j等于10的时候f[10]=400,循环到j等于15的时候f[15]的值为600,循环到j==20,f[20]=800,然后放第三种物品,当 j == 10的时候f[10]的值变为500,j = = 20的时候f[20]的值变为1000,因此,当第三种物品放两件时背包中的所放物品的价值最大。

for(i=1;i<=n;i++)
	for(j=w[i];j<=V;j++)
		f[j]=max(f[j],f[j-w[i]]+v[i]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值