該演算法的貪心選擇的意義:
基本步驟:
用i代表第i個活動,s[i]代表第i個活動開始時間,f[i]代表第i個活動的結束時間,然後按結束時間從早到晚排序。
系統依次檢查活動i是否與當前已選擇的所有活動相容。若相容,活動i加入已選擇活動的集合中,否則,不選擇活動i,而繼續檢查下一活動與集合a中活動的相容性。且若活動i與之相容,則i成為最近加入集合a的活動,並取代活動j的位置。
挑選出結束時間盡量早的活動,並且滿足後乙個活動的起始時間晚於前乙個活動的結束時間,全部找出這些活動就是最大的相容活動子集合。
舉個例子:
//活動安排問題 貪心演算法
#include
using
namespace std;
void
greedyselector
(int n,
int s,
int f,
bool a)
;int
main()
;// 下標從1開始,活動開始時間
int f=
;// 下標從1開始,活動結束時間
cout <<
"各活動的開始時間,結束時間分別為:"
<< endl;
for(
int i =
1;i <= n;i++
) cout <<
"["<< i <<
"]:"
<<
"("<< s[i]
<<
","<< f[i]
<<
")"<< endl;
// 貪心演算法-活動安排問題
greedyselector
(n, s, f, a)
;// 輸出
cout <<
"\n最大相容活動子集為:\n"
;for
(int i =
1;i <= n;i++)if
(a[i]
) cout <<
"["<< i <<
"]:"
<<
"("<< s[i]
<<
","<< f[i]
<<
")"<< endl;
return0;
}void
greedyselector
(int n,
int s,
int f,
bool a)
else
a[i]
=false;}
}
活動安排問題 貪心演算法
問題表述 設有n個活動的集合 e 其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活 i都有乙個要求使用該資源的起始時間 si和乙個結束時間 fi,且 si 如果選擇了活動 i,則它在半開時間區間 si,fi 內占用資源。若區間 si,fi 與區間 sj,...
活動安排問題(貪心演算法)
類似的問題是 選點問題和區間覆蓋問題。活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了乙個簡單 漂亮的方法使得盡可能多的活動能相容地使用公共資源。設有n個活動的集合e 其中每個活動都...
活動安排問題 貪心演算法
活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了乙個簡單 漂亮的方法使得盡可能多的活動能相容地使用公共資源。設有n個活動的集合e 其中每個活動都要求使用同一資源,如演講會場等,而在同...