(基于Java)算法之贪心算法——活动安排问题

贪心算法(Greedy Algorithm:又名贪婪算法。贪心算法是指,在对问题求解时,总是做出在当期看来是最好的选择。也就是说,贪心算法能决定出最好的下一步,它不是从整体最优上考虑,而仅仅是在某种意义上的局部最优解

值得注意的是:在某些问题上,用贪心算法也能得到原问题的最优解。


活动安排问题描述:

设有n个活动的集合E={1,2,……,n},每个活动要是用同一个资源,而在同一时间内只能让一个活动使用。每个活动i都有对应的开始时间si和结束时间fi,且si<fi。该问题就是要求出所给的活动集E中最大的时间相容活动子集合。

贪心策略:最早结束时间优先 (最晚开始时间优先也是可以的,原理上一样)

定义:s[]代表开始时间,f[]代表结束时间,n表示活动个数

准备工作:先对f[]进行排序,而且保持s[]与f[]一致


下面贴出代码,因为排序可以查阅本博以前的博文,就不提供了,因此只有短短几行

public static int[] GreedyAc(int s[], int f[], int n){
	int x[] = new int[n];
	x[0] = 1;
	int j = 0; //j用来表示f数组的下标值
	for(int i = 1; i < n; i++){
		//判断下一个活动的开始时间是否比当前活动的结束时间晚
		if(s[i] >= f[j]){
			x[i] = 1;
			j = i;
		}
	}
	return x;
}


另外,贪心算法也有一个跟0-1背包问题类似的背包问题,但是背包问题的要求跟0-1背包问题的要求不同,背包问题不一定要把物品整个装进背包,可以把物品分成一部分来装入背包。贪心策略只要设计成 Vi与Wi的比值优先就可以了。


如果有什么不对的地方或者有更好建议,欢迎评论留言

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/notfamous/article/details/24599205
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞