貪心演算法 活動選擇問題

2021-06-13 10:59:16 字數 1154 閱讀 6678

活動選擇問題:就是給定一組活動的開始時間和結束時間,然後他們都需要使用到乙個資源,這個資源每次只有乙個活動可以用,要求求出乙個最大的相互相容的活動子集。

首先定義了乙個集合sij

= , 其中s就是所有活動的集合,fi是活動ai的完成時間si是活動ai的開始時間。

這道題如果是用dp來解的話,就需要找到最優解的遞迴方程(其中c[i,j]是集合sij中的最大相容活動的個數):

然後根據dp自底向上的解答方法進行求解,過程和矩陣連乘的差不多。

然而,根據下面的定理,我們可以用貪心的策略來解答這道題目:

這樣子就將dp的兩個子問題變成了只有乙個子問題,而且由於將結束時間已公升序排序,所以要求出fm也是很簡單的。

接下來的工資就變得很簡單了,看下面的偽**和即可

recursive-activity-selector(s, f, i, j)  

1 m ← i + 1  

2whilem  

3dom ← m + 1  

4if

5    thenreturn∪ recursive-activity-selector(s, f, m, j)  

6else

returnø  

下面的是利用上面的遞迴演算法求解的過程

**如下:

#includeusing namespace std;

/**start 活動開始時間;finish 活動結束時間(已排序);record 記錄貪心演算法中所記錄的活動順序

*返回最多活動數

*/int greedy_activity_selector(int *start,int *finish,int *record,int length)

} return (j + 1);

}int main()

; int finish = ;

int record[11];

int actnum = greedy_activity_selector(start,finish,record,11);

cout<

貪心演算法 活動選擇問題

前言 貪心演算法也是用來解決最優化問題,將乙個問題分成子問題,在現在子問題最優解的時,選擇當前看起來是最優的解,期望通過所做的區域性最優選擇來產生乙個全域性最優解。書中先從活動選擇問題來引入貪心演算法,分別採用動態規劃方法和貪心演算法進行分析。本篇筆記給出活動選擇問題的詳細分析過程,並給出詳細的實現...

貪心演算法 活動選擇問題

需要閱讀這篇 的同學應該都知道貪心演算法的定義吧,所以這裡就不贅述什麼叫貪心演算法了。如果確實不知道什麼是貪心演算法,可以去看一下 演算法導論 問度娘也是挺好的。下面簡述一下活動選擇問題 你是乙個場地管理員,你收到的很多的活動申請,每個活動的開始時間和結束時間會有交錯,也就是說有些活動不能同時舉辦,...

貪心演算法 活動選擇問題

前言 貪心演算法也是用來解決最優化問題,將乙個問題分成子問題,在現在子問題最優解的時,選擇當前看起來是最優的解,期望通過所做的區域性最優選擇來產生乙個全域性最優解。書中先從活動選擇問題來引入貪心演算法,分別採用動態規劃方法和貪心演算法進行分析。本篇筆記給出活動選擇問題的詳細分析過程,並給出詳細的實現...