完全背包&01背包

完全背包
前言:上篇suibi写到了01背包的正解(不知道的戳这
完全背包,也是做选择,只不过有无穷件物品罢了所以完全背包只是在01背包上做亿一点点改动。
看代码:


#include<bits/stdc++.h>
using namespace std;
int bag,n,v[101],w[101],dp[1001];
int main()
{
	scanf("%d%d",&bag,&n);
	for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);
	for(int i=1;i<=n;i++)
	{
		for(int j=v[i];j<=bag;j++)
		{
			dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
		}
	}
	cout<<dp[bag]<<endl;
	return 0;
}

吃鲲
看看,看看!


#include<bits/stdc++.h>
using namespace std;
int bag,n,v[101],w[101],dp[1001];
int main()
{
	scanf("%d%d",&bag,&n);
	for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);
	for(int i=1;i<=n;i++)
	{
		for(int j=bag;j>=v[i];j--)
		{
			dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
		}
	}
	cout<<dp[bag]<<endl;
	return 0;
}

啥?没看出区别?你品,你细品……


for(int j=v[i];j<=bag;j++)
和
for(int j=bag;j>=v[i];j--)

wc**!两者之间只有这一点差别?假的吧?
不,只要看一组数据,就是真的了。

体积 价值
2 2
3 3
4 11
9 18
背包容量:9
如是01背包,肯定选一个9————人家2+3+4都没一个9大,肯定选9啊!
但是完全背包两个4他不香吗?两个4才8空间却又22价值,这就是01与完全的差别。
01背包反着枚是为了判重,反之,完全背包不用判重,所以就正着枚举了。

结论:完全背包和01背包很像,你甚至不用理解,知道就好。

记住,完全背包是正着,01背包是反着就好了!

posted @ 2020-08-06 10:53  riced  阅读(209)  评论(0编辑  收藏  举报