多重背包板子:
二进制优化:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#define r register
#define rep(i,x,y) for(r ll i=x;i<=y;++i)
#define per(i,x,y) for(r ll i=x;i>=y;--i)
using namespace std;
typedef long long ll;
const ll V=1e5+10;
ll n,m,x,y,s;
ll f[V],top,w[V],v[V];
int main()
{
scanf("%lld%lld",&n,&m);
rep(i,1,n)
{
scanf("%lld%lld%lld",&x,&y,&s);
for(ll j=1;j<=s;j<<=1)
{
v[++top]=x*j;
w[top]=y*j;
s-=j;
}
if(s)
{
v[++top]=x*s;
w[top]=y*s;
}
}
rep(i,1,top)
per(j,m,w[i])
f[j]=max(f[j],f[j-w[i]]+v[i]);
printf("%lld",f[m]);
return 0;
}