ZOJ 2109 FatMouse' Trade (背包 dp + 贪心)

来源:互联网 发布:昆明网络维护员 编辑:程序博客网 时间:2024/05/22 05:20

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1109

FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.
The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and requires F[i] pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get J[i]* a% pounds of JavaBeans if he pays F[i]* a% pounds of cat food. Here a is a real number. Now he is assigning this homework to you: tell him the maximum amount of JavaBeans he can obtain.

Input
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 J[i] and F[i] respectively. The last test case is followed by two -1's. All integers are not greater than 1000.

Output
For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of JavaBeans that FatMouse can obtain.

Sample Input
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1

Sample Output
13.333
31.500


翻译:

从前有只肥肥的老鼠,他叫FatMouse,他就像人类的恐怖分子跟敌人交易军火一样,猥琐的他准备了M磅猫食,准备与守卫仓库的大猫们进行交易,仓库里有他最爱吃的食物Javabean。
仓库里有N个房间,第i间房间里有J[i]磅Javabean且需要F[i]磅猫食进行交换,FatMouse不必吧每个房间里的Javabean全部用于交易,相反,他可以付给大猫F[i]*a%磅猫食,从而换的J[i]*a%磅的Javabean。其中,a是一个实数,现在他给你布置一个家庭作业,请你告诉他他最多能够获得多少磅Javabean。
输入描述:
输入包含多组测试数据,每组测试数据的开头一行是两个非负整数M, N.接下来的N行中,每行包含两个非负整数J[i]和F[i],最后一组测试数据是两个-1,所有的整数的值不糊超过1000;
输出描述:
对于每组测试数据,在一行上打印出一个3位小数的实数,这个实数是FatMouse能够交易到的最大数量的Javabean.


解题思路:
本题要求输出最大交易量,并保留三位小数,这样,我们使用J[i]除以F[i]就得到了a,那么,交易的时候,为了获得最多的Javabean,要先交易a大的,这样就确保了能交易到最多的Javabean.
把数据读入结构体中,再将结构体作为向量的元素,再按a由大到小的顺序给向量排序,然后依次进行计算,这种题目属于背包类的题目!(dp + 贪心)


代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <vector>#include <set>#define MAXN 10005#define RST(N)memset(N, 0, sizeof(N))#include <algorithm>using namespace std;typedef struct Mouse_ {    double J, F;    double a;}Mouse;int n, m;vector <Mouse> v;vector <Mouse> ::iterator it;bool cmp(const Mouse m1, const Mouse m2){    if(m1.a != m2.a) return m1.a > m2.a;    else return m1.F < m2.F;}int main(){    while(~scanf("%d %d", &n, &m)) {        if(n == -1 && m == -1) break;        Mouse mouse;        v.clear();        for(int i=0; i<m; i++) {            scanf("%lf %lf", &mouse.J, &mouse.F);            mouse.a = mouse.J/mouse.F;            v.push_back(mouse);        }        sort(v.begin(), v.end(), cmp);        double sum = 0;        for(int i=0; i<v.size(); i++) {            if(n > v[i].F) {                sum += v[i].J;                n -= v[i].F;            }else {                sum += n*v[i].a;                break;            }        }        printf("%.3lf\n", sum);    }    return 0;}


0 0
原创粉丝点击