题源看着是背包,其实是贪心
题目描述
阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 (N≤100) 堆金币,第 i 堆金币的总重量和总价值分别是mi,vi(1≤mi,vi≤100)。阿里巴巴有一个承重量为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 node{int w,v;double vag;
}p[110];
bool cmp(node p1,node p2){return p1.vag>p2.vag;
}int main()
{int n,t;double ant=0;int a=1;cin>>n>>t;for(int i=1;i<=n;i++){cin>>p[i].w>>p[i].v;p[i].vag=1.0*p[i].v/p[i].w;}sort(p+1,p+1+n,cmp);while(t>=p[a].w&&a<=n){ant+=p[a].v;t-=p[a].w;a++;}ant+=p[a].vag*t;printf("%.2f",ant);return 0;
}