完全背包&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背包反着枚是为了判重,反之,完全背包不用判重,所以就正着枚举了。 |