题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191
一个标准的多重背包,可以把多重背包转化为01背包
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int pic;
int w;
int s;
}m[200];
int dp[200];
int main()
{
int v,n;
int N;
scanf ("%d",&N);
while (N--)
{
scanf ("%d%d",&v,&n);
for (int i = 0;i < n;i++)
scanf ("%d%d%d",&m[i].pic,&m[i].w,&m[i].s);
memset (dp,0,sizeof (dp));
for (int i = 0;i < n;i++)
{
for (int j = 0;j < m[i].s;j++) //扫每种物品的每一个来转化为01背包
{
for (int k = v;k >= m[i].pic;k--)
{
dp[k] = max(dp[k],dp[k - m[i].pic] + m[i].w);
}
}
}
printf ("%d\n",dp[v]);
}
return 0;
}