问题描述
"嘟嘟嘟嘟嘟嘟
喇叭响
我是汽车小司机
我是小司机
我为祖国运输忙
运输忙"
这是儿歌“快乐的小司机”。话说现在当司机光有红心不行,还要多拉快跑。多拉不是超载,是要让所载货物价值最大,特别是在当前油价日新月异的时候。司机所拉货物为散货,如大米、面粉、沙石、泥土......
现在知道了汽车核载重量为w,可供选择的物品的数量n。每个物品的重量为gi,价值为pi。求汽车可装载的最大价值。(n<10000,w<10000,0<gi<=100,0<=pi<=100)
喇叭响
我是汽车小司机
我是小司机
我为祖国运输忙
运输忙"
这是儿歌“快乐的小司机”。话说现在当司机光有红心不行,还要多拉快跑。多拉不是超载,是要让所载货物价值最大,特别是在当前油价日新月异的时候。司机所拉货物为散货,如大米、面粉、沙石、泥土......
现在知道了汽车核载重量为w,可供选择的物品的数量n。每个物品的重量为gi,价值为pi。求汽车可装载的最大价值。(n<10000,w<10000,0<gi<=100,0<=pi<=100)
输入格式
输入第一行为由空格分开的两个整数n w
第二行到第n+1行,每行有两个整数,由空格分开,分别表示gi和pi
第二行到第n+1行,每行有两个整数,由空格分开,分别表示gi和pi
输出格式
最大价值(保留一位小数)
样例输入
5 36
99 87
68 36
79 43
75 94
7 35
99 87
68 36
79 43
75 94
7 35
样例输出
71.3
解释:
先装第5号物品,得价值35,占用重量7
再装第4号物品,得价值36.346,占用重量29
最后保留一位小数,得71.3
解释:
先装第5号物品,得价值35,占用重量7
再装第4号物品,得价值36.346,占用重量29
最后保留一位小数,得71.3
解题思路:一开始拿到题目,第一感觉用一个二维数组。读到后面看到要算出单位价值,还需要进行排序,就选择了结构体,方便使用sort()
按照单位价值排序完后,从单位价值高的开始装,装完后w减去相应货物的重量。也很容易想明白,如果w>=gi,那么这整个货物都装走;
如果w<gi,那么这个货物也就是装的最后一个货物了,装走部分。
ps:代码中注释也很详细了,自我感觉代码很精简了
1 #include<iostream>
2 #include<algorithm>
3 using namespace std;
4 struct item{
5 int gi;
6 int pi;
7 float gp;//pi除gi 单位价值
8 }it[100000];
9 bool com(const item &a,const item &b)
10 {
11 //结构体排序 按gp升序
12 return a.gp>b.gp;
13 }
14 int main()
15 {
16 int n,w;//n为供选择的物品数量 w为荷载重量
17 int i;//循环变量
18 float sum=0;//总价值
19 cin>>n>>w;
20 for(i=0;i<n;i++)
21 {
22 cin>>it[i].gi>>it[i].pi;
23 it[i].gp=it[i].pi*1.0/it[i].gi;
24 }
25 sort(it,it+n,com);//调用库函数sort
26 //排序完后,单位价值高的在数组前面
27 //理所应当的从数组前面还是遍历
28 for(i=0;i<n && w>0;i++)
29 {
30 //如果w大于物品的重量 那么全部司机带走
31 if(w>=it[i].gi){
32 sum+=it[i].pi;//sum累加上这个物品的价值
33 w-=it[i].gi;//w减去物品的重量
34 }
35 //如果w小于物品的重量
36 //也就是说 这是能装载的最后一件物品了
37 else {
38 sum+=(w*it[i].gp);
39 w=0;//直接归零
40 }
41 }
42 printf("%.1f",sum);
43 return 0;
44
45 }