题目描述
阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 �(�≤100)N(N≤100) 堆金币,第 �i 堆金币的总重量和总价值分别是 ��,��(1≤��,��≤100)mi,vi(1≤mi,vi≤100)。阿里巴巴有一个承重量为 �(�≤1000)T(T≤1000) 的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?
输入格式
第一行两个整数 �,�N,T。
接下来 �N 行,每行两个整数 ��,��mi,vi。
输出格式
一个实数表示答案,输出两位小数
输入数据 1
4 50
10 60
20 100
30 120
15 45
输出数据 1
240.00
提示
所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。
所以我们可以先求最简比再排序。
废话不多说,直接上代码。
#include <bits/stdc++.h>
using namespace std;
struct gold
{
int w;
float v;
}gg[110];
bool cmp(gold a, gold b){
return (a.v/a.w) > (b.v/b.w);
}
int main(int argc, char const *argv[])
{
float ret = 0;
float nowt,t;
int n;
cin >> n >> t;
nowt = t;
for(int i=0; i<n; i++){
cin >> gg[i].w >> gg[i].v;
}
sort(gg, gg+n, cmp);
for(int i=0; i<n; i++){
if(gg[i].w <= nowt){
ret += gg[i].v;
nowt -= gg[i].w;
} else if(gg[i].w > nowt){
ret += nowt*gg[i].v/gg[i].w;
break;
}
}
printf("%.2f",ret);
return 0;
}
做题不易,求赞,谢谢。