貪心算法(活動安排問題)

使用貪心算法的條件

    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.根據貪心的準則,明確需要進行判斷的依據是什麼?(活動安排問題,想要多的活動,就判斷活動的結束時間,越早結束,安排的節目更多)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章