题目 1917: 快乐司机

这篇博客探讨了一种利用贪心算法解决汽车装载货物以实现最大价值的问题。在考虑了汽车核载重量和各种货物的重量、价值比例后,通过选取单位重量价值最高的货物优先装载,实现了在不超过载重限制下的最大收益。文章还提到了如果改为整装货物,可能需要采用动态规划的方法,并给出了C语言实现的贪心算法代码示例。
摘要由CSDN通过智能技术生成

题目

“嘟嘟嘟嘟嘟嘟
喇叭响
我是汽车小司机
我是小司机
我为祖国运输忙
运输忙”
这是儿歌“快乐的小司机”。话说现在当司机光有红心不行,还要多拉快跑。多拉不是超载,是要让所载货物价值最大,特别是在当前油价日新月异的时候。司机所拉货物为散货,如大米、面粉、沙石、泥土…
现在知道了汽车核载重量为w,可供选择的物品的数量n。每个物品的重量为gi,价值为pi。求汽车可装载的最大价值。(n<10000,w<10000,0<gi<=100,0<=pi<=100)

输入
输入第一行为由空格分开的两个整数n w
第二行到第n+1行,每行有两个整数,由空格分开,分别表示gi和pi

输出
最大价值(保留一位小数)

样例输入

5 36
99 87
68 36
79 43
75 94
7 35

样例输出

71.3

解题思路

本题采用贪心算法,选取价格/质量之比最高的货物优先拉,如果拉完了还未达到载货量上限,则拉取价格/质量之比次之的货物,以此类推,直到满载。

易错点

本题如果改为整装货物,那么需要采用动态规划的方法,如果构建二维数组,则行列可以是物品的编号,和货车的装载能力(类似01背包问题)。

代码

#include<stdio.h>
#include<stdlib.h>

struct goods{
    double w;//重量
    double v;//总价
    double p;//单价
};

int cmp(const void *a, const void *b){
    struct goods c = *(struct goods *)a;
    struct goods d = *(struct goods *)b;
    if (c.p>d.p)
        return -1;
    else
        return 1;
}

int main()
{
	int n,i;
	double sum=0,w;
	scanf("%d %lf",&n,&w);
	struct goods G[n];
	for (i=0;i<n;i++)
	{
	    scanf("%lf %lf",&G[i].w,&G[i].v);
	    G[i].p = G[i].v/G[i].w;
	}
	qsort(G,n,sizeof(G[0]),cmp);
	for (i=0;i<n;i++)
	{
	    if (w>G[i].w)
	    {
	        sum+=G[i].v;
	        w-=G[i].w;
	    }
	    else
	    {
	        sum+=G[i].p*w;
	        break;
	    }
	}
	printf("%.1lf",sum);
	return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值