贪心算法
在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
1.区间调度问题
假设有如下课程,希望尽可能多的将课程安排在一间教室里:
课程 | 开始时间 | 结束时间 |
---|---|---|
美术 | 9AM | 10AM |
英语 | 9:30AM | 10:30AM |
数学 | 10AM | 11AM |
计算机 | 10:30AM | 11:30AM |
音乐 | 11AM | 12AM |
算法设计:
- 1.选择结束最早的课,便是要在这教室上课的第一节课
- 2.接下来,选择第一堂课结束后才开始的课,并且结束最早的课,这将是第二节在教室上的课。
代码:
import java.util.*;
public class Main{
public static void main(String[] args) {
String subject[] = {
"英语","数学","计算机","音乐","美术"};
Work[] works = {
new Work(1,3),
new Work(2, 5),
new Work(4, 7),
new Work(6, 9),
new Work(8, 10)
};
int result = solution(works);
System.out.println(result);
}
private static int solution(Work[] works) {
//works里面已经按end从小到大排序了
Arrays.sort(works);
int count = 0;
//当前工作的结束时间
int endTime = 0;
for(int i = 0;i<works.length;i++){
if(endTime<works[i].getStart()){
count++;
endTime = works[i].getEnd();
}
}
return count;
}
static class Work implements Comparable{
private int start;
private int end;
public Work(int start, int end) {
this.start = start;
this.end = end;
}
//end 从小到大排序
@Override
public int compareTo