多重背包模板题
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n, dp[105];
struct Dami
{
int v, w, d;
} ri[105];
void deal(int x)
{
int i;
if(ri[x].d*ri[x].v>=n)
{
for(i=ri[x].v;i<=n;i++)
dp[i]=max(dp[i],dp[i-ri[x].v]+ri[x].w);
}
else
{
int k=1;
while(k<ri[x].d)
{
for(i=n;i>=ri[x].v*k;i--)
dp[i]=max(dp[i-ri[x].v*k]+ri[x].w*k,dp[i]);
ri[x].d-=k;
k*=2;
}
for(i=n;i>=ri[x].v*ri[x].d;i--)
{
dp[i]=max(dp[i-ri[x].v*ri[x].d]+ri[x].w*ri[x].d,dp[i]);
}
}
}
int main()
{
int T, m, i;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
for(i=0;i<m;i++)
scanf("%d%d%d",&ri[i].v,&ri[i].w,&ri[i].d);
for(i=0;i<m;i++)
deal(i);
printf("%d\n",dp[n]);
}
return 0;
}