uva 10130(01背包)

来源:互联网 发布:php 请求参数加密 编辑:程序博客网 时间:2024/06/10 19:37

题意:有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;elsef[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;}


0 0
原创粉丝点击