标签:
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 }
标签:
原文地址:http://www.cnblogs.com/charlotteandxing/p/4695689.html