貪心演算法 一 活動安排問題

2021-12-29 21:35:19 字數 1257 閱讀 2327

對很多最優化問題來說,採用動態規劃方法來解決就有點大材小用了。有時候我們可以採用貪心演算法來取代。貪心算

法是通過所做的區域性最佳選擇來產生乙個全域性最優解。而且和動態規劃不同的是,它是通過自頂向下的方式來解決每

乙個子問題。而活動安排問題可以說是貪心演算法的乙個入門學習。

當我看到這個問題時,首先就想到了自己大一做acm時在杭電acm裡遇到的乙個題目:今年暑假不ac。可以說這個題

目就是活動安排問題的翻版,只是乙個講的是怎麼安排最多活動,乙個講的是最多能看到的電視節目。但本質是一樣

的。下面我就以今年暑假不ac這道題目來說明吧。

當時看到這道題的時候想的是排序,然後暴力找。開始是按開始時間排序的,結果發現這樣做沒什麼意義。因為有的

節目開始很早,但可能是最晚乙個接受的,這樣的話不能保證能得出最大值。於是便以結束時間來排序,毫無疑問,

排在最前面的那個肯定可以看,然後以這個為基礎,從後依次遍歷,找到第乙個開始時間大於這個結束時間的節目,

並將這個節目在陣列中的下標i做乙個標記,並設k = i,然後從這個節目開始繼續往後遍歷,找出第乙個節目j,使

a[j].start >= a[k].end。然後設k = j,繼續往後遍歷。依此迴圈下去,直到遍歷完所有節目。實現**如下:

[cpp] 

#include  

struct node  

;    

int main()  

for (i = 0; i < n - 1; i++)  

}  }  

count = 1;  

k = 0;  

for (i = 1; i < n; i++)  

}  printf("%d\n", count);  

}  return 0;  

}   

今天看了書才知道這用到了貪心思想,下面這個**是根據書上提供的遞迴形式寫的,意思是一樣的。

[cpp]  

#include  

struct node  

;    

int count;  

void fun (node a, int i, int n)  

}  int main()  

for (i = 0; i < n - 1; i++)  

}  }  

count = 1;  

fun(a, 0, n-1);  

printf("%d\n", count);  

}  return 0;  

}   

活動安排問題 貪心演算法

問題表述 設有n個活動的集合 e 其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活 i都有乙個要求使用該資源的起始時間 si和乙個結束時間 fi,且 si 如果選擇了活動 i,則它在半開時間區間 si,fi 內占用資源。若區間 si,fi 與區間 sj,...

活動安排問題(貪心演算法)

類似的問題是 選點問題和區間覆蓋問題。活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了乙個簡單 漂亮的方法使得盡可能多的活動能相容地使用公共資源。設有n個活動的集合e 其中每個活動都...

活動安排問題 貪心演算法

活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了乙個簡單 漂亮的方法使得盡可能多的活動能相容地使用公共資源。設有n個活動的集合e 其中每個活動都要求使用同一資源,如演講會場等,而在同...