acm演算法之貪心演算法
一般使用貪心演算法要滿足兩個條件:
a.貪心選擇性質 —— 可通過做區域性最優(貪心)選擇來達到全域性最優解。(貪心選擇性質:這是貪心演算法與動態規劃的區別)
b.最優子結構性質 —— 問題的最優解包含了子問題的最優解。
貪心演算法的基本思想
找出整體當中每個小的區域性的最優解,並且將所有的這些區域性最優解合起來形成整體上的乙個最優解。因此能夠使用貪心演算法的問題必須滿足下面的兩個性質:
1.整體的最優解可以通過區域性的最優解來求出;
2.乙個整體能夠被分為多個區域性,並且這些區域性都能夠求出最優解。使用貪心演算法當中的兩個典型問題是活動安排問題和揹包問題。
貪心演算法的基本步驟 :
1、從問題的某個初始解出發。
2、採用迴圈語句,當可以向求解目標前進一步時,就根據區域性最優策略,得到乙個部分解,縮小問題的範圍或規模。
3、將所有部分解綜合起來,得到問題的最終解。
注意:用貪心演算法的時候關鍵在於:
1.如何證明每一步所做的貪心選擇,最終可以使最後結果最優。
2.如何制定可行的貪心策略。
3.貪心演算法就是只要滿足當前利益最大化即可,所以有時候得出的結果不是最優解。
區別:動態規劃一般是以「自底向上的方式解決問題(如數塔問題)」,而貪心是以「自上向下的方式解決問題(如hdu2037(活動安排)「。
最優子結構性質:這個性質是貪心和動規的共同點。也就是乙個問題的最優解要包含其子問題的最優解。
舉個例子來說;
揹包問題
題意:抗洪搶險中,官兵在一家商店發現有 n 件物品:第 i 件物品值 vi 元,重 wi 磅(1<= i <= n),此處 vi 和 wi 都是整數。他希望搶救下的東西價值越高越好,但他的揹包最多只能裝下 w 磅的東西(w為整數)。有兩種搶救方式:
(1)0-1揹包問題
如果每件物品或被帶走或被留下,應該帶走哪幾樣東西?
(2)部分揹包問題
如果允許可帶走某個物品的一部分,應該帶走哪幾樣東西,每件東西的重量是多少?
對於搶救方式一(1),考慮重量至多為 w 磅的最值錢的一包東西,若從中去掉物品 j ,餘下的必須是從其餘的 n-1 件物品中可帶走的、重量至多為 w-wj 的最值錢的一件東西;如果再從中去掉物品 i ,餘下的也必須是從其餘 n-2 件可帶走的、重量至多為 w-wj-wi 的最值錢的一件東西,以此類推
void fangshi_1(int x,type v,type w,type c,int n)
}}
對於搶救方式二:
如果考慮從最優貨物中去掉某物品 j 的重量 wp (wj >= wp),則餘下的物品必須是可以從 n-1 件原有物品和物品 j 的 wj-wp 中可帶走的、重量至多為 w-wp 的最值錢的一件東西,以此類推
void fangshi_2(int n,float m,float v,float w,float x)
if(i<=n)
x[i]=c/w; //注意剩餘情況
}
ACM 貪心演算法
這是大學期間acm校賽時我出的一道題,考貪心演算法,沒有牽涉複雜的資料結構,有題目加源 贏取最多最有價值的禮物 problem description 五一期間到長沙烈士公園玩,走進去之後,發現許多人在圍在一起玩一種遊戲,遊戲規則是 給你m個環,用乙個環可以套住乙個禮物,同時丟擲時要花費一秒鐘的時間...
ACM 貪心演算法
acm 貪心演算法 在求最優解問題的過程中,依據某種貪心標準,從問題的初始狀態出發,直接去求每一步的最優解,通過若干次的貪心選擇,最終得出整個問題的最優解,這種求解方法就是貪心演算法。從貪心演算法的定義可以看出,貪心演算法不是從整體上考慮問題,它所做出的選擇只是在某種意義上的區域性最優解,而由問題自...
ACM演算法貪心演算法一
貪心演算法總的來說就是把整個問題分成幾個步驟分別求出其最優解,最終得出整個問題的最優解。所以,貪心的某種意義就是求區域性最優解。並且如果乙個問題可以同時用幾種方法解決的話,貪心演算法應該是最好的選擇之一。在使用貪心演算法時要依次考慮以下步驟 候選集合a 問題的最終解均取自於候選集合a,解集合s 解集...