oj 75 贪心算法
2016-03-30 21:04
316 查看
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; struct sa{ int j; int f; double awk; }data[1001]; int cmp(const sa &a,const sa &b) { return (a.awk)>(b.awk);//为什么要用const } int main() { int m,n; double sum; int i; while (cin>>m>>n) { sum=0; if (m==-1&&n==-1) break; for (i=0;i<n;i++) { cin>>data[i].j>>data[i].f; data[i].awk=(double)data[i].j/data[i].f; } sort (data,data+n,cmp); for (i=0;i<n;i++) { if (m>=data[i].f) { sum=sum+data[i].j; m=m-data[i].f; } else { sum=sum+m*data[i].awk;//m很小的时候一个个算 break;//没走完所有的房间就没有猫粮了 } }printf ("%.3f\n",sum); } return 0; }
贪心算法:
贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。
这种局部最优选择并不总能获得整体最优解(Optimal Solution),但通常能获得近似最优解(Near-Optimal Solution)。
例:用贪心法求解付款问题。
假设有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾客4元6角现金,为使付出的货币的数量最少,首先选出1张面值不超过4元6角的最大面值的货币,即2元,再选出1张面值不超过2元6角的最大面值的货币,即2元,再选出1张面值不超过6角的最大面值的货币,即5角,再选出1张面值不超过1角的最大面值的货币,即1角,总共付出4张货币。
相关文章推荐
- 【C++】《C++标准程序库》小结第十二章-数值
- 1054. 求平均值
- 图说js中的this——深入理解javascript中this指针
- 多线程不能不知道的之线程入门
- GDAL库进度信息编写示例
- NOIp 2004 合并果子
- Struts2学习——1
- kernel编译生成Image zImage uImage的区别
- Android判断网络连接是否可用【从新浪云搬运】
- GDAL库进度信息编写示例
- 华为笔试(2)
- System.Web.UI.Page事件执行顺序
- 配置python环境使用tushare股票数据
- JMX获取普通JAVA程序运行的线程
- Twitter Storm开篇之作
- Hexo NexT从源码级别高度定制
- 裁剪平面ClipPlane
- caffe --- mistakes
- 设计模式之桥连接
- HTML+CSS基础篇(五)——十天精通CSS