上文发布了二维的01背包数组,这是其优化:
其实很简单,只需将j倒序枚举,便可省去判断的麻烦
#include <iostream>
using namespace std;
int f[11000], v[110], w[110], m, n;//vi为物品体积,wi为物品价值,m为背包可容纳总体积,n为背包可容纳物品总数量
int main()
{
cin >> m >> n;
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] << endl;
return 0;
}
又及:01背包变式(背包必须装满) :
#include <cstring>
using namespace std;
int f[11000],v[110],w[110],m,n;
int main()
{
cin >> m >> n;
for(int i=1;i<=n;i++)
{
cin >> v[i] >> w[i];
}
memset(f,0xc0,sizeof(f));
f[0]=0;
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 << max(f[m],0) << endl;
return 0;
}
注意,最后的结果可能为负数,需与0取最大值输出