贪心算法(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的比值优先就可以了。
如果有什么不对的地方或者有更好建议,欢迎评论留言