使用貪心算法的條件
1.貪心選擇性質:即所求問題的最優解可以通過一系列局部最優的選擇來達到。
2.最優子結構性質:當一個問題的最優解包含其子問題的最優解時,稱此問題有最優子結構性質
活動安排問題:
有11個活動,活動按照結束時間的非遞減排序如下:
i 1 2 3 4 5 6 7 8 9 10 11
start[i] 1 3 0 5 3 5 6 8 8 2 12
finish[i] 4 5 6 7 8 9 10 11 12 13 14
思路:
1.需要先選定你的貪心的準則,是儘量活動安排的多,那麼就以結束時間爲基準,誰最先結束就先安排哪個活動
2.因爲活動已經按照結束時間排序了,所以當前一個活動的結束時間與後一個活動的開始時間無衝突,就安排這個活動。
具體實現:
package 中級;
public class 貪心算法活動安排問題 {
//貪心算法總是做出在當前看來是最好的選擇
public static void main(String[] args) {
//開始時間數組
int[] start = {1,3,0,5,3,5,6,8,8,2,12};
//結束時間數組
int[] end = {4,5,6,7,8,9,10,11,12,13,14};
//創建一個數組存儲是否安排活動
boolean[] arrange = new boolean[11];
//遍歷數組,判斷那些需要安排,安排的規則是按照順序,沒有相交的部分就安排
arrange[0] = true;
for(int i=1,j = 0;i<start.length;i++){
//如果前一個的結束時間比後一個的開始時間小。則安排下去
if(end[j] < start[i]){//符合要求
arrange[i] = true;
j = i;//如果成立,則j就是下一個作爲參考的時間
}else{
arrange[i] = false;
}
}
System.out.print("安排的活動有:");
for(int i=0;i<arrange.length;i++){
if(arrange[i] == true){
System.out.print(i+",");
}
}
}
}
總結:
1.這個問題用貪心算法是否能解決
2.如果能夠使用貪心算法,那麼貪心的準則是什麼?(活動的問題的貪心準則就是活動的數量)
3.根據貪心的準則,明確需要進行判斷的依據是什麼?(活動安排問題,想要多的活動,就判斷活動的結束時間,越早結束,安排的節目更多)