活動安排問題:
貪心策略:根據給的活動開始時間和結束時間,活動安排至少有三種看似合理的貪心策略可 供選擇。
(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中活動相容性。
例:設待安排的11個活動的開始時間和結束時間按結束時間的非減序排列如下:
演算法greedyselector 的計算過程如下圖所示。圖中每行相應於演算法的一次迭代。陰影長條表示的活動是已選入集合a的活動,而空白長條表示的活動是當前正在檢查相容性的活動。
若被檢查的活動i的開始時間si小於最近選擇的活動j的結束時間fi,則不選擇活動i,否則選擇活動i加入集合a中。
貪心演算法並不總能求得問題的整體最優解。但對於活動安排問題,貪心演算法greedyselector卻總能求得的整體最優解,即它最終所確定的相容活動集合a的規模最大。這個結論可以用數學歸納法證明。
實現**如下:
#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 其中每個活動都...