演算法之列舉和貪心

2021-08-15 07:26:03 字數 1231 閱讀 7025

列舉(亦稱窮舉)演算法

原理:列舉法的本質就是從所有候選答案中去搜尋正確的解,使用該演算法需要滿足兩個條件:(1)可預先確定候選答案的數量;(2)候選答案的範圍在求解之前必須有乙個確定的集合。

核心思想:列舉所有的可能。列舉演算法簡單粗暴,他暴力的列舉所有可能,盡可能地嘗試所有的方法。雖然列舉演算法非常暴力,而且速度可能很慢,但確實我們最應該優先考慮的!因為列舉法變成實現最簡單,並且得到的結果總是正確的。 **

貪心演算法

原理:貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解

具體操作:做貪心演算法的基本思路是從問題的某乙個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能獲得區域性最優解。每一步只考慮乙個資料,他的選取應該滿足區域性優化的條件。若下乙個資料和部分最優解連在一起不再是可行解時,就不把該資料新增到部分解中,直到把所有資料列舉完,或者不能再新增演算法停止

過程:建立數學模型來描述問題;

把求解的問題分成若干個子問題;

對每一子問題求解,得到子問題的區域性最優解;

把子問題的解區域性最優解合成原來解問題的乙個解。

活動選擇問題

這是《演算法導論》上的例子,也是乙個非常經典的問題。有n個需要在同一天使用同乙個教室的活動a1,a2,…,an,教室同一時刻只能由乙個活動使用。每個活動ai都有乙個開始時間si和結束時間fi 。一旦被選擇後,活動ai就佔據半開時間區間[si,fi)。如果[si,fi]和[sj,fj]互不重疊,ai和aj兩個活動就可以被安排在這一天。該問題就是要安排這些活動使得盡量多的活動能不衝突的舉行。例如下圖所示的活動集合s,其中各項活動按照結束時間單調遞增排序。

用貪心法的話思想很簡單:活動越早結束,剩餘的時間是不是越多?那我就早最早結束的那個活動,找到後在剩下的活動中再找最早結束的不就得了?

雖然貪心演算法的思想簡單,但是貪心法不保證能得到問題的最優解,如果得不到最優解,那就不是我們想要的東西了,所以我們現在要證明的是在這個問題中,用貪心法能得到最優解。

演算法初入門 列舉 遞迴。貪心

1.列舉 列舉法,也稱作窮舉,指的是從問題所有可能的解的集合中一一枚舉各元素。題目中給定的檢驗條件判定哪些是無用的,哪些是有用的。優點是演算法簡單,在區域性地方使用列舉法,效果十分好。缺點是運算量過大,當問題的規模變大的時候,迴圈的階數越大,執行速度越慢。例題 百錢買白雞問題 有乙個人有一百塊錢,打...

萌新小灶之列舉貪心

p1230 智力大衝浪 很經典的一道貪心題,好像也是我當時初學貪心時寫的第一道題。當時是在jzyz oj上,有點懷念呢 貪心策略 盡量完成價值高的任務 跟之前相比有所進步,會把自定義sort函式寫在結構體定義裡了 拍飛 include include include include include ...

啊哈!演算法 之列舉

for i 1 i 9 i 這就是採用列舉的方法,把所有的可能性都進行了嘗試。對於形如這樣的火柴棍,如何在全部使用給定的火柴 m 24 後拼出a b c的等式呢?1.等式中存在固定不變的地方,就是加號與等號,他們一共佔4根。2.a a c這種,只能存在一次。3.a b c與b a c視為不同的兩組。...