[快乐司机]

这是一道简单的贪心题(类似于简单的背包问题)来看看题目与思路

题目描述:

汽车核载重量为 w,可供选择的物品的数量 n。每个物品的重量为 gi​, 价值为 pi​。求汽车可装载的最大价值。(n<10000,w<10000,0<gi​≤100,0≤pi​≤100)

输出描述:

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

样例输入:

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

样例输出:

70.1

解题思路:

一道简单的贪心题,只需要把货物的单价从大到小排列然后凑最大载重量就可以了

代码:

#include<bits/stdc++.h>
using namespace std;
struct huo
{
    double g;//重量 
    double p;//总价 
    double d;//单价 
}c[10002];
bool cmp(huo a,huo b)//结构体排序,对单价进行排序 
{
    return a.d>b.d;
}
int main()
{
    int n,m;//分别为种类数和最大载重 
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        cin>>c[i].g>>c[i].p;
        c[i].d=c[i].p/c[i].g;
    }
    sort(c,c+n,cmp);
    int j=0,k=0;
    double ans=0;
    while(j<m)
    {
    	if(j+c[k].g<=m)
		{
			ans+=c[k].p;
			j+=c[k].g;
			}
			else//当所需装的物品总重超过最大载重的时候,剩下的载重都装载此物品 
			{
				ans+=c[k].d*(m-j);
				break;
			}
			
			k++;	
	}
	printf("%.1lf",ans);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值