1.題目描述:活動安排問題
設有n個活動集合e= ,其中每個活動都要求使用同一資源,而在同一時間內只有乙個活動能使用這一資源;
每個活動 i 都有乙個要求使用該資源的起始時間 si 和乙個結束時間 fi,且 si < f i。如果選擇了活動 i ,則它在半開時間區間 [si ,fi)內占用資源;
若區間 [si,fi) 與區間[sj,fj) 不相交,則稱活動 i 與活動 j 是相容的。即當 si >= fj 或sj >= fi 時,活動 i 與 活動 j 相容;
活動安排問題就是要在所給的活動結合中選出最大的相容活動子集和
2.分析:——使用貪心演算法實現
該問題即要求高效的安排一系列爭用某一公共資源的活動。
3.貪心演算法:
貪心策略:根據給的活動開始時間和結束時間,活動安排至少有三種看似合理的貪心策略可 供選擇。
(1)每次從剩下未安排的活動中選擇具有最早開始時間且不會與已安排的活動重疊的活動來安排,這樣可以增大資源的利用率。
(2)每次從剩下未安排的活動中選擇使用時間最短且不會與已安排的活動重疊的活動來安排。
(3)每次從剩下未安排的活動中選擇最早結束時間且不會與已安排的活動重疊活動來安排。
通過比較上面三種策略,我們知道應該選用第三種,因為根據「活動結束時間=活動開始時間+使用資源時間」
根據問題描述和所選用的貪心策略,對貪心策略求解活動安排的greedyselector演算法設計思路如下:
(1)初始化。將k個活動的開始時間儲存在陣列s中;將k個活動的結束時間儲存在陣列f中且按照結束時間的非減序:f1≤f2≤…≤fn,陣列s需要做相應的調整;採用集合a來儲存問題的解,即所選擇的活動集合,活動i如果在集合a中,當且僅當a[i]=ture.
(2)根據貪心策略,演算法greedyselector首先選擇活動1,即令a[1]=true.
(3)依次掃瞄每乙個活動,如果活動i的開始時間不小於最後乙個選入集合a中的活動結束時間,即活動i和a中活動相同,則將活動i加入集合a中;否則,放棄活動i,繼續檢查下乙個活動與集合a中活動相容性。
4.**實現:
#includevoid greedy(int s,int f,int a,int k);
int main()
; int f = ;
int k;
k = sizeof(f)/sizeof(f[0]);
int *a;
a = (int*)malloc(sizeof(int)*k);
greedy(s,f,a,k);
system("pause");
}
/* * s:活動的開始時間
* f:活動的結束時間(非降序排列)
* a:0或者1,為0表示活動不被安排,1表示活動被安排
* k:活動個數
*/
void greedy(int s,int f,int a,int k)
} printf("總計%d個活動被安排\n",count);
}
貪心演算法 活動安排問題(C )
該演算法的貪心選擇的意義 基本步驟 用i代表第i個活動,s i 代表第i個活動開始時間,f i 代表第i個活動的結束時間,然後按結束時間從早到晚排序。系統依次檢查活動i是否與當前已選擇的所有活動相容。若相容,活動i加入已選擇活動的集合中,否則,不選擇活動i,而繼續檢查下一活動與集合a中活動的相容性。...
活動安排問題 貪心演算法
問題表述 設有n個活動的集合 e 其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活 i都有乙個要求使用該資源的起始時間 si和乙個結束時間 fi,且 si 如果選擇了活動 i,則它在半開時間區間 si,fi 內占用資源。若區間 si,fi 與區間 sj,...
活動安排問題(貪心演算法)
類似的問題是 選點問題和區間覆蓋問題。活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了乙個簡單 漂亮的方法使得盡可能多的活動能相容地使用公共資源。設有n個活動的集合e 其中每個活動都...