部分背包问题

题目描述
给定一个最大载重量为M的卡车和N种食品,有食盐,白糖,大米等。
已知第i种食品的最多拥有Wi公斤,其商品价值为Vi元/公斤,
编程确定一个装货方案,使得装入卡车中的所有物品总价值最大。
输入
第一行输入两个整数M和N,用空格隔开
第二行到第N+1行每一行输入两个数wi和vi,表示第i种物品的重量和单位价值。
输出
使得装货价值最大的装货方案和总价值。
先输出若干行,每一行输出货物编号和该种货物装货的重量。
最后一行输出该种装货方案所装物品的总价值。

【算法分析】
贪心算法策略:因为每一个物品都可以分割成单位块,
单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,
可以用贪心法解答,方法如下:先将单位块收益按从大到小进行排列,
然后用循环从单位块收益最大的取起,直到不能取为止便得到了最优解。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 struct obj
 4 {
 5     int id;
 6     double w;
 7     double v;
 8 };
 9 int cmp(const void *a,const void *b)
10 {
11     double ans= ((struct obj*)b)->v -((struct obj*)a)->v;
12     if(ans<0) return -1;
13     else if(ans>0) return 1;
14     else return 0;
15 }
16 int main()
17 {
18     double M;
19     int N;
20     struct obj *a;
21     int i;
22     double maxV=0;
23     
24     scanf("%lf%d",&M,&N);
25     
26     if(M<=0)
27     {
28         printf("输入的数据可能不正确:汽车空间不能为0或负数。\n");
29         return 0;
30     }
31     
32     a=(struct obj *)malloc(N*sizeof(struct obj));
33     for(i=0;i<N;i++)
34     {
35         a[i].id=i+1;
36         scanf("%lf%lf",&a[i].w,&a[i].v);
37     }
38     
39     qsort(a,N,sizeof(struct obj),cmp);
40     
41     for(i=0;i<N&&M>0;i++)
42     {
43         if(a[i].w<=M)
44         {
45             printf("%d %lf\n",a[i].id,a[i].w);
46             M=M-a[i].w;
47             maxV=maxV+a[i].v*a[i].w;
48         }
49         else
50         {
51             printf("%d %lf\n",a[i].id,M);
52             maxV=maxV+M*a[i].v;
53             M=0;
54             break;
55         }
56     }
57     printf("%lf\n",maxV);
58     free(a);
59     return 0;
60 }

 

上一篇:基于CentOS的ECS实例实现OSS反向代理


下一篇:如何在 Ubuntu 20.04上安装 Skype