AcWing 5. 多重背包问题 II
原题链接
中等
作者:
Esperanza
,
2020-09-12 20:41:04
,
所有人可见
,
阅读 402
//多重背包二进制优化
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int o=2000010;
int n,v,id;
int c[o],val[o],f[o];
void separate(int k,int cc,int vv){
id++;
c[id]=k*cc;
val[id]=k*vv;
}
int main(){
scanf("%d%d",&n,&v);
int cc,vv,s;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&cc,&vv,&s);
int k=1;
while(k<=s){
separate(k,cc,vv);
s-=k;
k*=2;
}
if(s>0)separate(s,cc,vv);
}
//注意此时物品总量是id不是n
for(int i=1;i<=id;i++)
for(int j=v;j>=c[i];j--)
f[j]=max(f[j],f[j-c[i]]+val[i]);
printf("%d",f[v]);
return 0;
}