题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191
解题思路:此题为多重背包,具体思想可以去看背包九讲。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define M 110
#define N 2010
int n,m,ca,tot,z,w,v;
int dp[N];
int main()
{
scanf("%d",&ca);
while(ca--)
{
scanf("%d%d",&m,&n);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;++i)
{
scanf("%d%d%d",&w,&v,&z);
if(w*z>=m)
{
for(int j=w;j<=m;++j)
dp[j]=max(dp[j],dp[j-w]+v);
}
else
{
int k=1;
while(k<z)
{
for(int j=m;j>=k*w;--j)
dp[j]=max(dp[j],dp[j-k*w]+k*v);
z-=k;
k<<=1;
}
for(int j=m;j>=z*w;--j)
dp[j]=max(dp[j],dp[j-z*w]+z*v);
}
}
printf("%d\n",dp[m]);
}
return 0;
}