多重背包
洛谷 P1776
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,w[10000005],f[1000005],v[1000005],cnt;
inline int read(){
int x=0,w=1;char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch-48),ch=getchar();
return x*w;
}
int main(){
n=read();m=read();
for(register int i=1;i<=n;++i){//在线二进制拆分
int a=read(),b=read(),c=read();
for(register int j=1;j<=c;j<<=1){
v[++cnt]=j*a,w[cnt]=j*b;
c-=j;
}
if(c) v[++cnt]=a*c,w[cnt]=b*c;
}
for(register int i=1;i<=cnt;++i)//01背包
for(register int j=m;j>=w[i];--j)
f[j]=max(f[j],f[j-w[i]]+v[i]);
printf("%d\n",f[m]);
return 0;
}