题意:有n个物品,每个物品都有自己的重量和价值,有m个人,每个人每种物品只能取一个,并且每个人都有自己最大能承受的重量,要求每个人在自己的承受重量范围内,取到的物品价值总和最大。
题解:01背包模板题,只不过需要将所有人的最优解都加起来。
#include <stdio.h>
#include <string.h>
const int N = 1005;
struct Obj {
int v, w;
}obj[N];
int n, m, f[N][N * 100], c[N];
void dp(int maxx) {
for (int i = 1; i <= n; i++)
for (int j = 0; j <= maxx; j++) {
if (i == 1)
f[i][j] = 0;
else
f[i][j] = f[i - 1][j];
if (j >= obj[i].w) {
int temp = f[i - 1][j - obj[i].w] + obj[i].v;
if (f[i][j] < temp)
f[i][j] = temp;
}
}
}
int main() {
int cases;
scanf("%d", &cases);
while (cases--) {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d%d", &obj[i].v, &obj[i].w);
scanf("%d", &m);
int res = 0, maxx = -1;
for (int i = 0; i < m; i++) {
scanf("%d", &c[i]);
if (maxx < c[i])
maxx = c[i];
}
dp(maxx);
for (int i = 0; i < m; i++)
res += f[n][c[i]];
printf("%d\n", res);
}
return 0;
}