贪心算法- 杭电OJ 1009 FatMouse' Trade

来源:互联网 发布:易语言获取js后的源码 编辑:程序博客网 时间:2024/06/05 09:17

这学期开始学算法,讲到了贪心。贪心算法的基本思想就是并不是从整体角度出发,而是做出在当前看来最好的选择,做出的选择只是局部最优选择,虽然不能得到整体最优解,但最后结果是最优解的一个近似解,即用局部最优“代替”全局最优。当然光听老师讲,再看看书是没用,要实际敲出代码才能得到锻炼,于是我找了杭电上的一个题目来作为贪心算法的实际练习。

1009 - FatMouse' Trade

题目大意:有M个猫的食物,要去仓库中用这些猫食换自己的食物,仓库有N个房间,每个房间对应一个换算比例,即用多少猫食换多少自己的食物,求出最多能换多少自己的食物。

 

分析:每个房间对应一个J(自己需要的食物)和F(猫食),要想换更多的食物,那自己所用的猫食就得越少,即J和F的比值越大的那个房间,能换到的食物越多,所以需要按这个比值将房间排序,然后逐个换取就得到了最大能换到的食物,这里贪心的思想体现为:总是从当前能换到的最多的食物的那个房间开始换,即找到局部最优解。

 

这里用到了C++中的排序函数sort,并自定义了比较函数cmp用来比较J和F的比值.

AC代码如下:

#include <iostream>#include <algorithm>#include <iomanip>using namespace std;struct JF{    double J;    double F;};bool cmp(const JF& T1, const JF& T2){    return (T1.J / T1.F) > (T2.J / T2.F);//按比例排序}int main(){    int m, n;    double sum;    JF Fat[1000];    while (cin >> m >> n && m != -1 && n != -1)    {        sum = 0;        for (int i = 0; i < n; ++i)        {            cin >> Fat[i].J >> Fat[i].F;        }        sort(Fat,Fat + n,cmp);        for (int i = 0; i < n && m > 0; ++i)        {            if (m < Fat[i].F)            {                sum += m * (Fat[i].J / Fat[i].F);//若不够当前房间全部换取额,则按比例能换多少换多少                m = 0;            }            else            {                sum += Fat[i].J;                m -= Fat[i].F;            }        }        cout << fixed << setprecision(3) << sum << endl;    }    return 0;}


0 0
原创粉丝点击