基础算法 —— 贪心算法
【概述】
貪心算法是從問題的初始狀態出發,通過若干次的貪心選擇而得到的最優值的一種求解策略,即貪心策略。
簡單來說,貪心策略是一種在每次決策時采取當前意義下最優策略的算法,做出的選擇至少在某種約束條件下的局部最優解或較優解,并不一定是全局的最優解或較優解,但在某些特定的情況下,可以利用貪心算法來求得其最優解或較優解。
貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無后效性,即:某個狀態以前的過程不會影響以后的狀態,只與當前狀態有關。
當一個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質,問題的最優子結構性質是該問題可以用動態規劃或者貪心算法求解的關鍵特征。
【一般步驟】
簡單來說,就是根據要求,不斷選擇最大/最小的,直到滿足/不滿足條件為止
/* 候選集合A:問題的最終解均取自于候選集合A。 解集合S:解集合S不斷擴展,直到構成滿足問題的完整解。 解決函數solution:檢查解集合S是否構成問題的完整解。 選擇函數select:貪心策略,這是貪心算法的關鍵。 可行函數feasible:解集合擴展后是否滿足約束條件。 */ Greedy(A) {S={ };//初始解集合為空集while (not solution(S))//集合S沒有構成問題的一個解{x=select(A);//在候選集合A中做貪心選擇if feasible(S, x)//判斷集合S中加入x后的解是否可行S = S+{x};A = A-{x};}return S; }【例題】
1.最優選擇問題
問題:給出 n 個物品,第 i 個物品重量為 wi,選擇盡量多的物品,使得總重量不超過 C
貪心策略:由于只關心物品重量,因此將所有物品按重量從小到大排序,依次選擇每個物品,直到裝不下為止
同題:數列分段(信息學奧賽一本通-T1428):點擊這里
同題:排隊接水(信息學奧賽一本通-T1319):點擊這里
2.部分背包問題
問題:n 個物品,第 i 個物品重量為 wi,價值為 vi,在總重量不超過 C 的情況下讓總價值盡量高,每一個物品可以取走一部分,價值與重量按比例計算
貪心策略:本質上在最優選擇問題的基礎上加了價值項,不能僅考慮重量因素或價值因素,應該綜合考慮兩個因素,即優先選擇價值和重量比值最大的,直到重量和為 C,需要注意的是,由于每個物品只能選擇一部分,因此一定可以讓總重量恰好為 C,而且除了最后一個物品以外,其他物品要么不選要么全選
3.乘船問題
問題:n 個人,第 i 個人重量為 wi,每艘船載重為 C,最多可乘 2?個人,現在想用最少的船將所有人運走,問船的數量
貪心策略:將所有人按重量從小到大排序,依次考慮最輕的人 i,如果每個人都不能與他一起乘船,那么就只能每個人都乘一條船,否則,其能選擇能與他一起乘的人中重量最終的一個 j,這樣使得眼前的浪費最少
4.選擇不相交區間問題
問題:給定 n 個開區間 (a,b),選擇盡量多個區間,使得這些區間兩兩沒有公共點。
貪心策略:將每個區間按結束時間從小到大排序,即按:b[1]<=b[2]<=...<=b[n] 的順序排序,最初選擇結束時間最早的活動 temp=b[1],然后每次考慮最早的開始時間 a[i],如果比當前選擇的區間的結束時間要晚 a[i]>temp,那么就選擇這個區間,即有:temp=b[i],res++
5.區間選點問題
問題:給定 n 個閉區間 [a,b],在數軸上選盡量少的點,使得每個區間內都至少有一個點
貪心策略:首先按照區間右端點從小到大排序,然后從區間 1 到區間 n 進行選擇,對于當前區間,若集合中的數不能覆蓋他,則將集合末尾的數加入集合
6.區間覆蓋問題
問題:給 n 個閉區間 [a,b],選擇盡量少的區間覆蓋一條指定的線段區間 [s,t]
貪心策略:將所有的區間按左端點從小到大排序,依次處理每個區間,每次選擇覆蓋點 s 的區間中右端點坐標最大的一個,并將 s 更新為該區間的右端點坐標,直到選擇的區間包含 t 為止
7.帶限期與罰款的單位時間任務調度
問題:n 個任務,每個任務需要一個單位時間執行,任務 i 的截止時間 di表示任務 i 在時間 di 前必須完成,誤時罰款 wi 表示任務 i 若未在 di 前完成,導致 wi 的罰款,確定所有任務的執行順序使得罰款最少
貪心策略:要使罰款最少,就盡量完成 w[i] 值較大的任務,此時將任務按 w[i] 從大到小排序,按排好的順序對任務進行安排:使得處理任務 i 的時間在 d[i] 之內又盡量靠后,如果 d[i] 時間之內的時間都已排滿,就放棄處理該任務
8.其他
同題:均分紙牌(信息學奧賽一本通-T1320):點擊這里
總結
以上是生活随笔為你收集整理的基础算法 —— 贪心算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1016:整型数据类型
- 下一篇: 移动玩具(信息学奥赛一本通-T1453)