4.2 活動安排問題
設有n個活動的集合e=,其中每個活動都要 求使用同一資源,如演講會場等,而在同一時間內只有乙個 活動能使用這一資源。 每個活動i都有乙個要求使用該資源的起始時間si和乙個 結束時間fi,且si<fi。如果選擇了活動i,則它在半開時間區 間[si, fi)內占用資源。若區間[si, fi)與區間[sj, fj)不相交,則 稱活動i與活動j是相容的。當si≥fj或sj≥fi時,活動i與活動j相 容。 活動安排問題就是在所給的活動集合中選出最大的相容 活動子集合。
輸入: 測試資料的第一行是正整數n (n≤100),表示活動數,後跟n 行,每行的三個數分別表示活動的 編號、開始時間、結束時間,資料 之間由乙個空格分隔開。 輸出: 輸出選中的活動編號(或選中 的活動個數)。
輸入樣例:
111 1 4
2 3 5
3 0 6
4 5 7
5 3 8
6 5 9
7 6 10
8 8 11
9 8 12
10 2 13
11 12 14
輸出樣例:
1 4 8 11
**實現:
//acm貪心演算法——活動安排問題
#include #include using namespace std;
struct actioninfo ;
bool cmp(const actioninfo &a, actioninfo &b);
int main()
//對所有活動按照endtime公升序排序
sort(act, act + actionsgroups, cmp);
//把此活動加入符合條件的集合
int currentaction = 0, count = 0; //當前符合要求的活動
int notconflictactionsindex[100]; //此處用乙個常量來定義
notconflictactionsindex[count] = act[0].index;
for (int j = 1; j < actionsgroups; j ++)
} //輸出
for (int k = 0; k <= count; k ++)
delete act; //釋放資源
system("pause");
return 0;
}bool cmp(const actioninfo &a, actioninfo &b)
return false;
}
總結:
1資料結構:
struct action ;
2排序:按活動的結束時間公升序排序 排序比較因子:
if (a.f<=b.f) return true;
return false; } 使用標準模板庫函式排序: sort(a, a+n, cmp);
此處推薦一片具體介紹c++ sort函式的文章:
stl sort 函式內部的實現 為什麼會比你寫的快
3 貪心選擇:優先選擇結束時間早的
4 活動安排問題就是要在所給的活動集合中選出最大 的相容活動子集合,是可以用貪心演算法有效求解的很好 例子。 該問題要求高效地安排一系列爭用某一公共資源的 活動。 貪心演算法提供了乙個簡單、漂亮的方法使得盡可能 多的活動能相容地使用公共資源。
4.3 貪心演算法
貪心演算法***是一種在每一步選擇中都採取在當前狀態 下最好或最優的選擇,希望得到結果是最好或最優的演算法。 貪心演算法是一種能夠得到某種度量意義下的最優解的 分級處理方法,通過一系列的選擇得到乙個問題的解,而 它所做的每一次選擇都是當前狀態下某種意義的最好選擇。 即希望通過問題的區域性最優解求出整個問題的最優解。 這種策略是一種很簡潔的方法,對許多問題它能產生 整體最優解,但不能保證總是有效,因為它不是對所有問 題都能得到整體最優解。 利用貪心策略解題,需要解決兩個問題: (1)該題是否適合於用貪心策略求解; (2)如何選擇貪心標準,以得到問題的最優/較優解。
***貪心選擇性質: 貪心選擇性質是指所求問題的整體最優解可以通過一 系列區域性最優的選擇,即貪心選擇來達到。 這是貪心演算法可行的第乙個基本要素,也是貪心演算法 與動態規劃演算法的主要區別。 (1)在動態規劃演算法中,每步所做的選擇往往依賴 於相關子問題的解,因而只有在解出相關子問題後,才能 做出選擇。 (2)在貪心演算法中,僅在當前狀態下做出最好選擇, 即區域性最優選擇,然後再去解出這個選擇後產生的相應的 子問題。
最優子結構: (1) 當乙個問題的最優解包含其子問題的最優解時,稱此 問題具有最優子結構性質。 運用貪心策略在每一次轉化時都取得了最優解。問題的最 優子結構性質是該問題可用貪心演算法或動態規劃演算法求解 的關鍵特徵。 (2) 貪心演算法的每一次操作都對結果產生直接影響,而動 態規劃則不是。 貪心演算法對每個子問題的解決方案都做出選擇,不能回退; 動態規劃則會根據以前的選擇結果對當前進行選擇,有回 退功能。 動態規劃主要運用於二維或三維問題,而貪心一般是一維 問題。
使用貪心演算法求解問題應該考慮如下幾個方面: (1)候選集合a:為了構造問題的解決方案,有乙個候 選集合a作為問題的可能解,即問題的最終解均取自於 候選集合a。 (2)解集合s:隨著貪心選擇的進行,解集合s不斷擴充套件, 直到構成滿足問題的完整解。 (3)解決函式solution:檢查解集合s是否構成問題的 完整解。 (4)選擇函式select:即貪心策略,這是貪心法的關鍵, 它指出哪個候選物件最有希望構成問題的解,選擇函式 通常和目標函式有關。 (5)可行函式feasible:檢查解集合中加入乙個候選對 象是否可行,即解集合擴充套件後是否滿足約束條件
以上主要通過老師對貪心演算法概念的講解及活動安排的主要解決步驟和貪心策略,對活動安排的**進行了實現。
活動安排問題 貪心演算法
問題表述 設有n個活動的集合 e 其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活 i都有乙個要求使用該資源的起始時間 si和乙個結束時間 fi,且 si 如果選擇了活動 i,則它在半開時間區間 si,fi 內占用資源。若區間 si,fi 與區間 sj,...
活動安排問題(貪心演算法)
類似的問題是 選點問題和區間覆蓋問題。活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了乙個簡單 漂亮的方法使得盡可能多的活動能相容地使用公共資源。設有n個活動的集合e 其中每個活動都...
活動安排問題 貪心演算法
活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了乙個簡單 漂亮的方法使得盡可能多的活動能相容地使用公共資源。設有n個活動的集合e 其中每個活動都要求使用同一資源,如演講會場等,而在同...