贪心算法概述
顾名思义:总是做出当前看来最优的选择,并不是整体上最优加以考虑,最初的选择只是在某种意义上的局部最优选择。
- 活动安排问题:要求高效地安排一系列争用某一公共资源的活动,使尽可能多的活动能够兼容地使用公共资源。
- n个活动的集合,每个活动都有开始时间s和结束时间f,
- 思想:按照结束时间非减排序,安排的活动不产生冲突,也就是前一个问题的结束时间f要小于下一个问题的开始时间s,满足条件即可进行活动安排。
java代码
int[] s //表示每个活动的开始时间
int[] f //表示每个活动的结束时间
boolean[] a //表示活动是否被选入
public class ActionOrder {
public int greedySelector(int[] s, int[] f, boolean[] a){
int n = s.length - 1;
a[1] = true;
int j = 1;
int count = 1; //已选中第一个活动
for (int i = 2; i <= n; i++){
if (s[i] >= f[j]){
a[i] = true;
j = i;
count++;
}else {
a[i] = false;
}
}
return count;
}
public static void main(String[] args) {
//这里是已经按照结束时间 f[] 排好序的数组
int[] s = {-1, 1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12};
int[] f = {-1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
boolean[] a = new boolean[s.length];
ActionOrder ac = new ActionOrder();
int counts = ac.greedySelector(s, f, a);
System.out.println("活动集合中最大相容活动数量为:" + counts);
System.out.println(counts + "个活动依次是:");
for (int i = 1; i <= s.length -1 ; i++){
if (a[i]){
System.out.println("第" + i + "个活动的开始时间:" + s[i] + ", 结束时间:" + f[i]);
}
}
}
}
活动集合中最大相容活动数量为:4
4个活动依次是:
第1个活动的开始时间:1, 结束时间:4
第4个活动的开始时间:5, 结束时间:7
第8个活动的开始时间:8, 结束时间:11
第11个活动的开始时间:12, 结束时间:14