Greedy Mouse
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
A fat mouse prepared M pounds of cat food,ready to trade with the cats guarding the warehouse containing his
favorite food:peanut. The warehouse has N rooms.The ith room containsW[i] pounds of peanut and requires
F[i] pounds of cat food. Fatmouse does not have to trade for all the peanut in the room,instead,he may get
W[i]*a% pounds of peanut if he pays F[i]*a% pounds of cat food.The mouse is a stupid mouse,so can you tell
him the maximum amount of peanut he can obtain.
- 输入
- The input consists of multiple test cases. Each test case begins with a line containing two non-negative integers M and N. Then N lines follow, each contains two non-negative integers W[i] and F[i] respectively. The test case is terminated by two -1. All integers are not greater than 1000.
- 输出
- For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of penaut that FatMouse can obtain.
- 样例输入
-
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1 - 样例输出
-
13.333
31.500
基本的背包问题,用贪心求解#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <utility>
using namespace std;
typedef pair<double,double> W;
bool cmp(const W& a,const W& b){ return a.first > b.first;}
int main(){
double m;
int n;
while(cin >> m >> n && m!=- && n!=-){
vector<W> exchange(n);
for(int i = ; i < n; ++ i){
double w,f;
cin >>w >>f;
exchange[i].first = w/f;
exchange[i].second = w;
}
sort(exchange.begin(),exchange.end(), cmp);
double res = ;
for(int i = ; i < n && m; ++i){
if(m > exchange[i].second/exchange[i].first){
res += exchange[i].second;
m -= exchange[i].second/exchange[i].first;
}else{
res+=m*exchange[i].first;
break;
}
}
printf("%0.3f\n",res);
}
}