AcWing 5. 多重背包问题 II
原题链接
中等
作者:
syqwq
,
2022-05-04 16:57:03
,
所有人可见
,
阅读 223
#include <iostream>
#include <cstring>
#include <algorithm>
#define re register
#define rep(i,a,b) for(re int i=a;i<=b;i++)
#define per(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N = 50050;
int n,m;
int tmpv,tmpw,tmps;
int cnt=0;
int v[N],w[N];
void bag01(){
int f[2005];
memset(f,0,sizeof(f));
// f[0]=1;
rep(i,1,cnt)
per(j,m,v[i])
f[j]=max(f[j],f[j-v[i]]+w[i]);
cout<<f[m];
}
int main()
{
cin>>n>>m;
rep(i,1,n){
cin>>tmpv>>tmpw>>tmps;
int b=1;
for(;tmps>=b;b<<=1)
v[++cnt]=tmpv*b,w[cnt]=tmpw*b,tmps-=b;
if(tmps){v[++cnt]=tmpv*tmps,w[cnt]=tmpw*tmps;}
}
bag01();
return 0;
}