圣诞老人的礼物

【题目描述】POJ4110
圣诞节来临了, 在城市 A 中圣诞老人准备分发糖果,现在有多箱不同的糖果:
• 每箱糖果有自己的价值和重量
• 每箱糖果都可以拆分成任意散装组合带走
• 圣诞老人的驯鹿最多只能承受一定重量的糖果
• 请问圣诞老人最多能带走 多大价值的糖果
【输入格式】
• 第一行由两个部分组成, 分别为 • 糖果箱数正整数 n (1 <= n <= 100)
• 驯鹿能承受的最大重量正整数 w (0 < w < 10000) 两个数用空格隔开
• 其余 n 行每行对应一箱糖果, 由两部分组成 • 一箱糖果的价值正整数 v
• 一箱糖果的重量正整数 w 中间用空格隔开
【输出格式】
• 输出圣诞老人能带走的糖果的最大总价值, 保留 1 位小数
• 输出为一行, 以换行符结束
【样例输入】
4 15
100 4
412 8
266 7
591 2
【样例输出】
1193.0
计算一下一箱糖果的价值与一箱糖果的重量之比,比值大的优先带走.
可以通过运算符重载来比较一下一箱糖果的价值与一箱糖果的重量的比值
#include<iostream>
#include<algorithm>
using namespace std;
struct canidy
{
	int vanlue;
	int weight;
	bool operator<(canidy& c)//定义一下比较函数,比值大的放在前面
	{
		return double (vanlue)/weight > double (c.vanlue) / c.weight;
	}

};






int main() {
	int x, y;//x表示糖果,y表示能携带的最大重量
	int n = 0;//已经携带的重量
	double m = 0;//糖果价值
	cin >> x >> y;
	canidy c[100];
	for (int i = 0;i < x;i++)
	{
		cin >> c[i].vanlue >> c[i].weight;
	}
	sort(c, c + x);//从大到小排序
	for (int i = 0;i < x;i++)
	{
		
		if (n +c[i].weight<= y)//已经携带的重量加上将要携带的重量小于携带的最大重量时直接加入即可
		{
			m = m + c[i].vanlue;
			n = n + c[i].weight;
		}
		else//如果超出则按剩余可携带的重量占将要携带的重量的比列来加入
		{
			double v = y-n;
			m = m + (v/c[i].weight) * c[i].vanlue;
			break;
		}
	}
	printf("%.1lf", m);




	return 0;


}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值