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!=-1 && n!=-1){ vector<W> exchange(n); for(int i = 0 ; 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 = 0; for(int i = 0 ; 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); } }