装船问题
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description
王小二毕业后从事船运规划工作,吉祥号货轮的最大载重量为M吨,有10种货物可以装船。第i种货物有wi吨,总价值是pi。王小二的任务是从10种货物中挑选若干吨上船,在满足货物总重量小于等于M的前提下,运走的货物的价重比最大。
Input
输入数据的第一行有一个正整数M(0 < M < 10000),表示所有货物最大载重量。在接下来的10行中,每行有若干个数(中间用空格分开),第i行表示的是第i种货物的货物的总价值pi ,总重量wi。(pi是wi的整数倍,0 < pi , wi < 1000)
Output
输出一个整数,表示可以得到的最大价值。
Example Input
100
10 10
20 10
30 10
40 10
50 10
60 10
70 10
80 10
90 10
100 10
Example Output
550
Hint
价重比:计算其价值与重量之比
01 | #include <stdio.h> |
02 | #include <stdlib.h> |
03 | struct node |
04 | { |
05 | int p, w, c; |
06 | }a[11], t; |
07 | void fx( struct node a[], int left, int right); |
08 | int main() |
09 | { |
10 | int i, n, money; |
11 | scanf ( "%d" , &n); |
12 | for (i = 0;i<10;i++) |
13 | { |
14 | scanf ( "%d%d" , &a[i].p, &a[i].w); |
15 | a[i].c = a[i].p/a[i].w; |
16 | } |
17 | fx (a, 0, 9); |
18 | money = 0; |
19 | for (i = 0;i<10;i++) |
20 | { |
21 | if (n<a[i].w) |
22 | { |
23 | money = money+n/a[i].c; |
24 | n = 0; |
25 | } |
26 | else |
27 | { |
28 | n = n-a[i].w; |
29 | money = money+a[i].p; |
30 | } |
31 | if (n<=0) |
32 | break ; |
33 |
34 | } |
35 | printf ( "%d\n" , money); |
36 | return 0; |
37 | } |
38 | void fx( struct node a[], int left, int right) |
39 | { |
40 | int i = left, j = right;t = a[left]; |
41 | if (left>=right) return ; |
42 | while (i<j) |
43 | { |
44 | while (i<j&&a[j].c<=t.c) j--; |
45 | a[i] = a[j]; |
46 | while (i<j&&a[i].c>=t.c) i++; |
47 | a[j] = a[i]; |
48 | } |
49 | a[i] = t; |
50 | fx(a, left, i-1); |
51 | fx(a, i+1, right); |
52 | } |