manyushenlan的博客

编程初学者,唯诚心与坚持不可弃~ 从零开始虚心向各博友学习,做一只快乐努力的蜗牛!...

基础入门之贪心算法

学习材料:《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



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






阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/manyushenlan/article/details/51537669
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭