1:01背包的初始算法:将每个物品遍历一遍,中间循环嵌套每一个容量的情况;
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int v[MAXN]; // 体积
int w[MAXN]; // 价值
int f[MAXN][MAXN]; // f[i][j], j体积下前i个物品的最大价值
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)//每个产品
{
for(int j=1;j<=m;j++)//背包的每个容量
{
f[i][j]=f[i-1][j];
if(j>=v[i])
{
f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
}
}
}
cout<<f[n][m];
}
2:01背包的进阶优化
同样是遍历每一个物品,但是在遍历容量的时候,从大到小遍历m-v[i]即可。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int v[MAXN]; // 体积
int w[MAXN]; // 价值
int f[MAXN]; // f[i][j], j体积下前i个物品的最大价值
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
{
for(int j=m;j>=v[i];j--)//从大到小遍历,依次填入,这样就可以遍历一遍,并且前边不会被污染。
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m];
}