数据结构算法之贪心算法

贪心算法

贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有
利)的选择,从而希望能够导致结果是最好或者最优的算法。
请看下面案例,假设有如下课程,希望尽可能多的将课程安排在一间教室里:
课程 开始时间 结束时间
美术 9:00 10:00
英语 9:30 10:30
数学 10:00 11:00
计算机 10:30 11:30
音乐 11:00 12:00
这个问题看似要思考很多,实际上算法很简单:

  1. 选择结束最早的课,便是要在这教室上课的第一节课
  2. 接下来,选择第一堂课结束后才开始的课,并且结束最早的课,这将是第二节在教室上的
    课。
    重复这样做就能找出答案,这边的选择策略便是结束最早且和上一节课不冲突的课进行排序,
    因为每次都选择结束最早的,所以留给后面的时间也就越多,自然就能排下越多的课了。
    每一节课的选择都是策略内的局部最优解(留给后面的时间最多),所以最终的结果也是近似最
    优解(这个案例上就是最优解)。
    贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最
    优解的结果。
    贪婪算法并没有固定的算法解决框架,算法的关键是贪婪策略的选择,根据不同的问题选择
    不同的策略。

在这里插入图片描述

#include<stdio.h>
#include<Windows.h>

//贪心算法
#define N 7

//钱的面值
	int value[]={1,2,5,10,20,50,100};
	int Count[]={10,2,3,1,2,3,5};


int greedy(int Money){

	//采取的方法是每一张面值都进行比较,然后结束条件是要么剩余的money小于0,要么钱数完了money还不为零就结束了
		
	int num=0;

	//从面值最大的开始
	for(int i=N-1;i>=0;i-- ){
		
		int c = Money/value[i];	//计算出需要几张这样的面值
		
		num = c>Count[i]?Count[i]:c;	//如果需要的面值数量大于该面值数量直接返回该面值数量否则返回c

		printf("需要面值为:%d的%d张\n",value[i],num);
		Money-=value[i]*num;

		if(Money==0) break;
	
	}
	if(Money!=0) num=-1;

	return num;
	



}

int main(){


	if(greedy(155)==-1){
	
		printf("数额无法找开.\n");
	}


	system("pause");
	return 0;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值