题意:
超市降价,全家m个人,能分别拿重量不超过per[i]的东西,n个物品(价格,重量),每个人一个物品最多拿一个,问全家在承重范围内能拿到东西的总最大价值。
思路:
01背包,思路同前几题。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[1005], p[1005], w[1005],per[105];
//dp[i][j] 前i个物品在剩余重量为J下的的最大价值
int main(){
int cas;
scanf("%d", &cas);
int n, m;
while (cas--) {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d%d", &p[i], &w[i]);
scanf("%d", &m);
for (int i = 1; i <= m; i++)
scanf("%d", &per[i]);
int v, sum = 0;
int i, j, k;
for (i = 1; i <= m; i++) {//m个人
v = per[i];//总重量v
memset(dp, 0, sizeof(dp));
for (j = 1; j <= n; j++) {//n件物品
for (k = v; k >= w[j]; k--) {
dp[k] = max(dp[k], dp[k - w[j]] + p[j]);
}
}
sum += dp[v];
}
printf("%d\n", sum);
}
return 0;
}