非常明显的多重背包,但是你看数据范围,物品数量这么多,如果老老实实枚举是肯定的会超时的,所以这里利用二进制优化,把一共 X 件物品通过二进制方式打包起来变成log X件物品
这样效率就会大大提高
打包完之后就跟普通的01背包一样的写法
然后一定要优化成一维哈,我偷懒用二维背包直接爆内存了。。
#include <bits/stdc++.h>
using namespace std;
int n,W;
int cnt;
int v[100000],w[100000];
int f[500000];
int main()
{
cin >> n >> W;
for(int i = 1; i <= n; i ++)
{
int a,b,c;
cin >> a >> b >> c;
int temp = 1;
while(temp <= c) //打包
{
c -= temp;
v[++cnt] = a * temp;
w[cnt] = b * temp;
temp *= 2;
}
if(c) //剩余的部分单独打包一份
{
v[++cnt] = a * c;
w[cnt] = b * c;
}
}
for(int i = 1; i <= cnt; i ++)
{
for(int j = W; j >= w[i]; j --)
{
f[j] = max(f[j], f[j - w[i]] + v[i]);
}
}
cout << f[W];
return 0;
}