算法之贪婪算法

【算法定义】

贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

【算法图示】

使用数学模型来描述问题,把求解的问题分解成若干个小问题。

1)活动选择问题

这是《算法导论》上的例子,也是一个非常经典的问题。有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。

算法之贪婪算法_第1张图片

①如果选择活动最早,不能得到最优解

②如果选择活动持续时间最短的,也不能得到最优解

③只有选择结束时间最早的活动也是最优解。直观上很好理解,按这种方法来实现,可以为未安排的活动留下尽可能多的时间

2)钱币找零问题

这个问题在我们的日常生活中就更加普遍了。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。在程序中已经事先将Value按照从小到大的顺序排好。

算法之贪婪算法_第2张图片

【程序设计】

/*********************************************************************************
	*Function:				give_change
	*Parameter1:			参数1:金额
	*Parameter2:			参数2:编号
	*Parameter3:			参数3:额数
	*Parameter4:			参数4:额度
	*Parameter5:			参数5:计数器
	*Description:			贪婪算法,参数1输入金额,通过参数2编号递减,然后参数3额数进行计算,
							参数4额度的大小来限定,最后计数器进行统计次数。
	*Output:				无
**********************************************************************************/

int give_change(int16_t money,int16_t number,int16_t subscript,int32_t *denomination,int32_t *param)
{
	int32_t result;
	if(money == 0)
	{
		return(0);
	}

	if(number == 0 || subscript == 0)
	{
		return(-1);
	}

	if(money<*denomination)
	{
		return(give_change(money,number,subscript - 1,denomination + 1,param));
	}
	else
	{
		*param=*denomination;
		result=give_change(money-*denomination,number-1,subscript,denomination,param+1);
		if(result>=0)
		{
			return(result+1);
		}
	}
}

 

你可能感兴趣的:(算法,算法)