就是01背包,每个人同一件物品只能拿一个,但不同人可以拿同一件物品。。。
开始以为每件物品只有一件,一下子觉得这问题太难了。。首先最优子结构找不到,如果一个人的背包拿最优的,可能就会影响其他人拿得,最终导致总结果不是最优,也就是不具备无后效性,就想着怎么转化问题。。。可是一直想不出来,看了别人的题解,才猛然发现原来题目中没说一种物品只有一件,实际上是可以有多件的。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX1 1100
#define MAX2 100
using namespace std;
int s[MAX1][2],fam[MAX2],dp[MAX1][MAX2];
int main()
{
int t,n,g,i,j,tt,all;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d %d",&s[i][0],&s[i][1]);
scanf("%d",&g);
for(i=0;i<g;i++)
scanf("%d",&fam[i]);
all=0;
for(i=0;i<g;i++)
{
memset(dp,0,MAX1*MAX2*4);
for(j=1;j<=n;j++)
{
for(tt=0;tt<=fam[i];tt++)
{
if(tt>=s[j][1])
{
dp[j][tt]=max(dp[j-1][tt-s[j][1]]+s[j][0],dp[j-1][tt]);
}
else
dp[j][tt]=dp[j-1][tt];
}
}
all+=dp[n][fam[i]];
}
printf("%d\n",all);
}
return 0;
}