您的位置:首页 > 其它

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

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: