【题目描述】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;
}