解题思路:多重背包裸题
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define inf 0x3f3f3f3f
using namespace std;
int dp[105];
struct node
{
int v,w,num;
}s[109];
int n,m;
void solve()
{
for(int i=0;i<m;i++)
{
int t=s[i].num,k=1,v=s[i].v,w=s[i].w;
while(k<t)
{
for(int j=n;j>=k*v;j--)
{
dp[j]=max(dp[j],dp[j-k*v]+k*w);
}
t-=k;
k*=2;
}
for(int j=n;j>=t*v;j--)
{
dp[j]=max(dp[j],dp[j-t*v]+t*w);
}
}
}
int main()
{
//freopen("t.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&s[i].v,&s[i].w,&s[i].num);
//cout<<i<<endl;
}
memset(dp,0,sizeof(dp));
solve();
int ma=0;
for(int i=0;i<=n;i++)
{
ma=max(ma,dp[i]);
}
printf("%d\n",ma);
}
return 0;
}