贪心算法- 杭电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
- 贪心算法- 杭电OJ 1009 FatMouse' Trade
- 杭电hdu 1009 FatMouse' Trade 贪心
- 杭电1009 FatMouse' Trade(贪心)
- 杭电1009-FatMouse' Trade(贪心)
- 杭电(1009)FatMouse' Trade (贪心)
- 杭电ACM OJ 1009 FatMouse' Trade 简单的贪心算法 入门级 翻译好题目就能做出来
- 湖北民族学院oj 1775(贪心)(杭电1009) 之 FatMouse's Trade
- 杭电OJ ——1009——FatMouse' Trade
- 杭电OJ hdu1009 FatMouse' Trade
- 【HDU-oj]-1009-FatMouse' Trade(贪心)
- 杭电1009 FatMouse' Trade
- 杭电1009 FatMouse' Trade
- 杭电1009-FatMouse' Trade
- 杭电 1009 FatMouse' Trade
- 杭电 1009 FatMouse' Trade
- 杭电1009--FatMouse' Trade
- 杭电 1009 FatMouse' Trade
- 【杭电1009】FatMouse' Trade
- 经典c程序(0004)---输入三个整数x,y,z,请把这三个数由小到大输出。
- Oracle PCTFREE PCTUSED FREELIST讲解
- 快速排序中交换两个数时,不使用辅助变量的bug. 陷阱
- CCLabelTTF和CCLabelAtlas区别(三种文字类的区别)
- NYOJ 20 吝啬的国度
- 贪心算法- 杭电OJ 1009 FatMouse' Trade
- ROS机器人小车素材
- UNIX Network Programming笔记之第二章
- HDU 1846 Brave Game
- 一些小技巧
- uva11525 - Permutation 线段树加速康托展开
- [算法]不使用*、/、+、-、%操作符求一个数的1/3
- 一些我推荐的和想上的网络课程
- Linux中常见的文件类型