UVa 10130 - SuperSale

Contents

  1. 1. Problem
  2. 2. Solution
  3. 3. Code

Problem

題目網址
中文網址

給你清單,和每個人的負重,看全部人 總共 可以買到最高多少?
P.S. 同一人物品不得重複,但不同人可以買相同商品。

Solution

背包問題,每個人最高負重為 30 ,直接做到 dp[30] 即可。不需要對每個人都做一次。

Code

UVa 10130UVa 10130 - SuperSale
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<cstdio>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define N 1000
#define MW 31

struct Object
{
int p, w;
}object[N];

int main()
{
int Case;
scanf("%d", &Case);

while (Case--)
{
int n, g, i, w;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d%d", &object[i].p, &object[i].w);

int dp[MW] = {}, ans = 0;
for (i = 0; i < n; i++)
for (w = MW - 1; w >= object[i].w; w--)
dp[w] = MAX(dp[w], dp[w - object[i].w] + object[i].p);

scanf("%d", &g);
for (i = 0; i < g; i++)
{
scanf("%d", &w);
ans += dp[w];
}
printf("%d\n", ans);
}

return 0;
}