1 /*========================================================
 2 题目描述 
 3 给定一个最大载重量为M的卡车和N种食品,有食盐,白糖,大米等。
 4 已知第i种食品的最多拥有Wi公斤,其商品价值为Vi元/公斤,
 5 编程确定一个装货方案,使得装入卡车中的所有物品总价值最大。
 6 输入
 7 第一行输入两个整数M和N,用空格隔开
 8 第二行到第N+1行每一行输入两个数wi和vi,表示第i种物品的重量和单位价值。
 9 输出
10 使得装货价值最大的装货方案和总价值。 
11 先输出若干行,每一行输出货物编号和该种货物装货的重量。
12 最后一行输出该种装货方案所装物品的总价值。 
13 
14 【算法分析】
15 贪心算法策略:因为每一个物品都可以分割成单位块,
16 单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,
17 可以用贪心法解答,方法如下:先将单位块收益按从大到小进行排列,
18 然后用循环从单位块收益最大的取起,直到不能取为止便得到了最优解。
19 
20 ==========================================================*/
21 #include<stdio.h>
22 #include<stdlib.h>
23 struct obj
24 {
25     int id;
26     double w;
27     double v;
28 };
29 int cmp(const void *a,const void *b)
30 {
31     double ans= ((struct obj*)b)->v -((struct obj*)a)->v;
32     if(ans<0) return -1;
33     else if(ans>0) return 1;
34     else return 0;
35 }
36 int main()
37 {
38     double M;
39     int N;
40     struct obj *a;
41     int i;
42     double maxV=0;
43     
44     scanf("%lf%d",&M,&N);
45     
46     if(M<=0)
47     {
48         printf("输入的数据可能不正确:汽车空间不能为0或负数。\n");
49         return 0;
50     }
51     
52     a=(struct obj *)malloc(N*sizeof(struct obj));
53     for(i=0;i<N;i++)
54     {
55         a[i].id=i+1;
56         scanf("%lf%lf",&a[i].w,&a[i].v);
57     }
58     
59     qsort(a,N,sizeof(struct obj),cmp);
60     
61     for(i=0;i<N&&M>0;i++)
62     {
63         if(a[i].w<=M)
64         {
65             printf("%d %lf\n",a[i].id,a[i].w);
66             M=M-a[i].w;
67             maxV=maxV+a[i].v*a[i].w;
68         }
69         else
70         {
71             printf("%d %lf\n",a[i].id,M);
72             maxV=maxV+M*a[i].v;
73             M=0;
74             break;
75         }
76     }
77     printf("%.2lf\n",maxV);
78     free(a);
79     return 0;
80 }