这道题开始我以为是将全家人所能携带重量的总和加起来,作为新的背包的容量,但样例过不了,后仔细一读题,原来是以每人为一个背包,最后计算各背包的总和。也就是多人的01背包问题。
代码如下:
#include<stdio.h>
#include<string.h>
#define MAXN 1000+10
int T, N, G, sum;
int p[MAXN], w[MAXN], mw[110], f[MAXN][35];
void solve()
{
memset(f, 0, sizeof(f));
sum = 0;
for(int k = 1; k <= G; k ++)
{
for(int i = 1; i <= N; i ++)
for(int j = 0; j <= mw[k]; j ++)
{
f[i][j] = f[i-1][j];
int t;
if(j>=w[i]&&(t = f[i-1][j-w[i]]+p[i]) >= f[i][j])
f[i][j] = t;
}
sum += f[N][mw[k]];
}
printf("%d\n",sum);
}
void input()
{
while(scanf("%d",&T) == 1)
while(T --)
{
scanf("%d",&N);
for(int i = 1; i <= N; i ++)
scanf("%d%d",&p[i],&w[i]);
scanf("%d",&G);
for(int i = 1; i <= G; i ++)
scanf("%d",&mw[i]);
solve();
}
}
int main()
{
input();
return 0;
}