基础入门之贪心算法

原创 2016年05月30日 16:17:01

学习材料:《2013年王道论坛计算机考研机试指南》

文中涉及对学习材料的摘录,以及自己的理解


1 题目【例2.11】:


1.1 题目分析:

总共拥有M pounds钱,去买N个room的X吨food;

第i个房间有J[i]吨food,对应所需F[i] pounds的钱;

如果剩余的钱不够买一个房间的全部食物,可以只买部分,那么  J[i] * a%吨食物 需要 F[i] * a% pounds的钱

目标——用有限的M pouds钱买尽可能多的食物

1.2 解题思路:

本质:在剩余储藏食物的房间中找性价比最高的房间 , 即 J[i] / F[i]最高的, 那么就应将N个房间按食物量与价格的性价比降序排列;

限制条件:依次购买按性价比降序排列的房间中的食物,直到钱花完或者购买完N个房间的食物;

注意:当最后剩余的钱不够买整个房间的食物,就按题中所述百分比购买部分

1.3 代码:

#include 

/* 只要涉及排序 用到sort 就有以下固定程序结构 */
#include 
using namespace std;
struct FoodRoom{
	int j;      //该房间的食物量
 	int f;      //该房间食物的总价格
	double s;   //该房间食物的性价比  (double)j/f
	bool operator <(const FoodRoom &A)const{
		return s > A.s; //重载<运算符,便于使用sort函数;又sort函数是升序 这里返回>运算 就可以实现降序
	}
}RoomBuf[1000];

int main()
{
	int M,N;
	while( scanf("%d%d",&M,&N) != EOF ){
		if( (M==-1) && (N==-1) ) break;

		int i; //房间号下标
		for(i=0; i0)&&(i RoomBuf[i].f )
			{
				M -= RoomBuf[i].f;
				ans += RoomBuf[i].j;
			}//若能买下整个房间的食物
			else
			{
				ans += ((double)M)/RoomBuf[i].f * RoomBuf[i].j;
				M = 0;
			}//只能买房间的部分食物
			i ++;
		}
		printf("%.3lf\n",ans );
		
	}
	return 0;
}


2 题目【例2.12】:


2.1 题目分析:

N个节目,每个节目的开始、结束时间已知:Time_s, Time_e;

目标:看尽量多的完整节目 ; 输出:所看的完整节目个数;

贪心策略:第一个节目选什么?  验证不是“开始时间最早的节目”,不是“持续时间最短的节目”, 而应该先看结束时间最早的节目

程序结束条件:依次选择结束时间最早的节目先看,直到看完最后一个节目,注意遍历N个节目的过程中,只有看完整的节目,才能算+1

2.2 代码:

#include 
#include 

using namespace std;

struct TvTime{
	int Time_s;   //开始时间
	int Time_e;   //结束时间
	bool operator < (const TvTime &A) const{
		//贪心策略为选择所有节目中结束时间最早的先看,所以重载<运算符,以实现按结束时间升序排列
		return Time_e < A.Time_e;
	}
}TvBuf[100];

int main(){
	int N;
	
	while( scanf("%d",&N) != EOF ) {
		if(N==0) break;   //break 整个while循环 调试时就是跳出命令行窗口

		int i;            //节目编号
		for(i=0; i



总结:选择一个合适的贪心策略需要一定的技巧。 也就是判断在具体问题中,什么才是“当前最好的”,当前最优解。






版权声明:本文为博主原创文章,未经博主允许不得转载。

【从入门到放弃】WEB前端之HTML+CSS基础03

下雨天,标签和CSS在一起布局更配哦,第三天开始我们的布局之旅之后会无期...
  • yanwydxf
  • yanwydxf
  • 2017年07月07日 13:59
  • 233

python之 前端HTML/CSS基础知识学习笔记

1. 文件结构: HTML文件的固定结构: html> head>...head> body>...body> html> html是根...
  • zhang123456456
  • zhang123456456
  • 2017年06月06日 21:42
  • 265

贪心算法之硬币问题

要求:给定面额为1,5,10,50,100,500这六种面额的硬币,各3,2,1,3,0,2枚,现在用这些硬币支付A元,求使用最少的硬币。先上代码:#include using namespace s...
  • sinat_36899414
  • sinat_36899414
  • 2017年08月02日 20:06
  • 216

可用贪心算法解决的几个基本问题

关键:看问题有没有贪心选择性质和最优子结构性质。有些问题看似是可以用贪心算法,但是实际用贪心算法却得不到最优解。构造贪心算法后,需要一定的证明来确定它的正确性。常用证明方法:反证法、调整法。 几个基...
  • sdcyzjq
  • sdcyzjq
  • 2011年08月24日 12:36
  • 3195

STM32F407 入门一

一、程序执行的一般流程 CM4内核通过ICode从Flash读取程序,然后进行计算,计算过程根据程序内容可能需要通过总线从某个外设读取数据,执行数据读取后,然后又进行计算得到计算结果后,通过总线把结果...
  • qq_30567891
  • qq_30567891
  • 2017年12月29日 16:56
  • 43

NYOJ - 14 - 会场安排问题(区间相关问题---选择不相交区间-贪心算法)

描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想...
  • qq_34594236
  • qq_34594236
  • 2016年10月19日 17:10
  • 258

傅里叶分析之从入门到放弃

作者:Heinrich 链接:https://zhuanlan.zhihu.com/p/19763358 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ...
  • qingfengtsing
  • qingfengtsing
  • 2016年10月20日 19:17
  • 976

我的AIX入门之路[完整版]

最近一不小心混成了这里aix入门论坛的版主,看到论坛的人气在慢慢汇集,而我又没做什么贡献,忽然想想,聊聊我的aix入门学习之路,让大家的茶余饭后,闲看闲聊一番:嘿,有点意思,以供消遣。     随手...
  • xinpo66
  • xinpo66
  • 2011年10月24日 23:07
  • 3940

FFMPEG基础库编程开发学习笔记——FFMPEG概述

声明一下:这些关于ffmpeg的文章只是用于记录我的学习历程和以便于以后查阅,文章中的一些文字可能是直接摘自于其他文章、书籍或者文献,学习ffmpeg相关知识是为了使用在Android上,我也才是刚开...
  • gc_gongchao
  • gc_gongchao
  • 2015年08月16日 20:50
  • 1569

《零基础学习软件测试》之LoadRunner从入门到精通

http://www.boobooke.com/bbs/thread-7641-1-1.html   0 性能测试常见用语 http://www.booboo...
  • liufangaliya
  • liufangaliya
  • 2016年08月11日 16:15
  • 1015
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基础入门之贪心算法
举报原因:
原因补充:

(最多只允许输入30个字)