演算法之活動安排問題
阿新 • • 發佈:2018-12-18
1. 問題描述:設有一個活動的集合E={1,2,…,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和結束時間fi且si<fi。如果選擇了活動i,則它在半開時間區間[si,fi)內佔用資源,若區間[si,fi)和區間[sj,fj)不相交,則稱活動i與活動j是相容的。活動安排問題就是在所給的活動集合中選出最大的相容活動子集合。
2. 問題分析:將所給活動集合按照結束時間遞增排序,首先將活動1新增進已選活動集合,然後依次檢查後面的活動與已選活動集合中元素的相容性,若相容則將其新增進來,否則忽略然後檢查下一個,直到結束。
3.複雜性分析:O(n)#include <iostream> using namespace std; void GreedySelector(int n,int s[],int f[],bool A[]) { A[0]=true; //將第一個活動新增進去 int index=0; for(int i=1;i<n;i++) { if(s[i]>=f[index]) { A[i]=true; index=i; } else A[i]=false; } } int main() { int s[]={1,3,0,5,3,5,6,8,8,2,12}, f[]={4,5,6,7,8,9,10,11,12,13,14}; bool A[11]; GreedySelector(11,s,f,A); for(int i=0;i<11;i++) cout<<A[i]<<" "; }