题目
多重背包的模板。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+10;
int read()
{
int res=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
res=res*10+ch-'0';
ch=getchar();
}
return res*f;
}
int w[maxn],v[maxn],f[maxn];
int n1,m,n;
int main()
{
n1=read();m=read();
for(int w1,v1,c,i=1;i<=n1;i++)
{
v1=read();w1=read();c=read();
for(int j=1;j<=c;j*=2)
{
++n;
v[n]=v1*j;
w[n]=w1*j;
c-=j;
}
if(c>0)
{
++n;
v[n]=v1*c;
w[n]=w1*c;
}
}
for(int i=1;i<=n;i++)
for(int j=m;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+v[i]);
cout<<f[m];
return 0;
}