贪心算法
贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有
利)的选择,从而希望能够导致结果是最好或者最优的算法。
请看下面案例,假设有如下课程,希望尽可能多的将课程安排在一间教室里:
课程 开始时间 结束时间
美术 9:00 10:00
英语 9:30 10:30
数学 10:00 11:00
计算机 10:30 11:30
音乐 11:00 12:00
这个问题看似要思考很多,实际上算法很简单:
- 选择结束最早的课,便是要在这教室上课的第一节课
- 接下来,选择第一堂课结束后才开始的课,并且结束最早的课,这将是第二节在教室上的
课。
重复这样做就能找出答案,这边的选择策略便是结束最早且和上一节课不冲突的课进行排序,
因为每次都选择结束最早的,所以留给后面的时间也就越多,自然就能排下越多的课了。
每一节课的选择都是策略内的局部最优解(留给后面的时间最多),所以最终的结果也是近似最
优解(这个案例上就是最优解)。
贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最
优解的结果。
贪婪算法并没有固定的算法解决框架,算法的关键是贪婪策略的选择,根据不同的问题选择
不同的策略。
#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;
}