当前位置 博文首页 > ice_elephant的博客:数据结构算法之贪心算法

    ice_elephant的博客:数据结构算法之贪心算法

    作者:[db:作者] 时间:2021-09-16 15:47

    贪心算法

    贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有
    利)的选择,从而希望能够导致结果是最好或者最优的算法。
    请看下面案例,假设有如下课程,希望尽可能多的将课程安排在一间教室里:
    课程 开始时间 结束时间
    美术 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;
    	}
    
    cs