基础入门之贪心算法

原创 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



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






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

hdoj fatmouse(贪心算法入门)

FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

杭电ACM OJ 1009 FatMouse' Trade 简单的贪心算法 入门级 翻译好题目就能做出来

FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)...

贪心算法入门

贪心算法入门完美字符串#include #include #include #include #include #include #include #include typedef l...

基础训练 完美的代价(贪心算法)

问题描述   回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。   交...

<基础训练>旅行家的预算(贪心算法)

问题描述   一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格...

hdu2037 今年暑假不AC(贪心算法基础--会场安排类似

今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su...

贪心算法基础(一)——数列极差

贪心算法的思想就是用局部的最优解,达到最后全局的最优解。贪心算法使用是有限制的,一个问题能不能使用贪心来做,往往我们要对其进行必要的证明。贪心算法策略具有无后向性,也就是当前阶段的状态确定之后,不受后...

数据结构基础 之 最短路径 贪心算法

Dijkstra算法是解单源最短路径问题的贪心算法。其基本思想是,设置顶点集合点集合S并不断地做贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。...

算法入门(3)——贪心算法

转自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741375.html 一、基本概念:所谓贪心算法是指,在对问题求解时,总是做出在当...
  • picway
  • picway
  • 2016年10月06日 21:35
  • 305
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基础入门之贪心算法
举报原因:
原因补充:

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