導航:首頁 > 源碼編譯 > 貪婪演算法基本的解題思路是什麼

貪婪演算法基本的解題思路是什麼

發布時間:2023-08-07 00:31:26

❶ 貪心演算法的證明方法

貪心演算法的基本思路如下:
1.建立數學模型來描述問題。
2.把求解的問題分成若干個子問題。
3.對每一子問題求解,得到子問題的局部最優解。
4.把子問題的解局部最優解合成原來解問題的一個解。
----------------------------------------------
其實歸納起來也就一個類。其他的都是分支

❷ 請問數錢的貪婪演算法怎樣確保得到最優解

貪婪演算法:總是作出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做出的僅是在某種意義上的局部最優解。
(註:貪婪演算法不是對所有問題都能得到整體最優解,但對范圍相當廣泛的許多問題它能產生整體最優解。但其解必然是最優解的很好近似解。

基本思路:——從問題的某一個初始解出發逐步逼近給定的目標,以盡可能快的地求得更好的解。當達到某演算法中的某一步不能再繼續前進時,演算法停止

實現該演算法的過程:
從問題的某一初始解出發;
while 能朝給定總目標前進一步 do
求出可行解的一個解元素;
由所有解元素組合成問題的一個可行解;

基本要素:
1、 貪婪選擇性質:所求問題的整體最優解可以通過一系列局部最優的選擇,即貪婪選擇來達到。(與動態規劃的主要區別)
採用自頂向下,以迭代的方式作出相繼的貪婪選擇,每作一次貪婪選擇就將所求問題簡化為一個規模更小的子問題。
對於一個具體問題,要確定它是否具有貪婪選擇的性質,我們必須證明每一步所作的貪婪選擇最終導致問題的最優解。通常可以首先證明問題的一個整體最優解,是從貪婪選擇開始的,而且作了貪婪選擇後,原問題簡化為一個規模更小的類似子問題。然後,用數學歸納法證明,通過每一步作貪婪選擇,最終可得到問題的一個整體最優解。
2、最優子結構性質:包含子問題的最優解
1、 設有n個活動的安排,其中每個活動都要求使用同一資源,如演講會場,而在同一時間只允許一個活動使用這一資源。每個活動都有使用的起始時間和結束時間。問:如何安排可以使這間會場的使用率最高。
活動 起始時間 結束時間
1 1 4
2 3 5
3 0 6
4 5 7
5 3 8
6 5 9
7 6 10
8 8 11
9 8 12
10 2 13
11 12 14

演算法:一開始選擇活動1,然後依次檢查活動一i是否與當前已選擇的所有活動相容,若相容則活動加入到已選擇的活動集合中,否則不選擇活動i,而繼續檢查下一活動的相容性。即:活動i的開始時間不早於最近加入的活動j的結束時間。
Prodere plan;
Begin
n:=length[e];
a {1};
j:=1;
for i:=2 to n do
if s[i]>=f[j] then
begin a a∪{i};
j:=i;
end
end;

例1 [找零錢] 一個小孩買了價值少於1美元的糖,並將1美元的錢交給售貨員。售貨員希望用數目最少的硬幣找給小孩。假設提供了數目不限的面值為2 5美分、1 0美分、5美分、及1美分的硬幣。售貨員分步驟組成要找的零錢數,每次加入一個硬幣。選擇硬幣時所採用的貪婪准則如下:每一次選擇應使零錢數盡量增大。為保證解法的可行性(即:所給的零錢等於要找的零錢數),所選擇的硬幣不應使零錢總數超過最終所需的數目。

假設需要找給小孩6 7美分,首先入選的是兩枚2 5美分的硬幣,第三枚入選的不能是2 5美分的硬幣,否則硬幣的選擇將不可行(零錢總數超過6 7美分),第三枚應選擇1 0美分的硬幣,然後是5美分的,最後加入兩個1美分的硬幣。

貪婪演算法有種直覺的傾向,在找零錢時,直覺告訴我們應使找出的硬幣數目最少(至少是接近最少的數目)。可以證明採用上述貪婪演算法找零錢時所用的硬幣數目的確最少(見練習1)。

❸ 貪心演算法總結

做了這10道題,其實發現貪心演算法沒有什麼規律,要說有什麼共同特點就是都是由局部最優從而推出全局最優,每個題基本上都要考慮其局部最優是什麼,其全局最優是什麼,所以雖然都用到了貪心演算法的思想,但是題與題之間又沒有什麼規律可言。

現在把這10道題的思路總結一下(總結主要以我的主觀看法在寫,可能別人看會不知道我在說什麼)

1.分發餅干:

https://programmercarl.com/0455.%E5%88%86%E5%8F%91%E9%A5%BC%E5%B9%B2.html

思路:想要完成最多的小孩滿足,那麼就得最小的餅干給胃口最小的小孩

這里的貪心思想,

局部最優就是盡可能讓一個餅干喂飽一個

全局最優就是最多的小孩滿足

2.擺動序列:

https://programmercarl.com/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.html

思路:這里要找到最長的擺動序列,那麼其實就是找那些波峰波谷,如圖所示

可以看出來,在到達波峰波谷的路上有幾個數字不會影響什麼,可以直接去掉。

那麼這里的局部最優就是把單調坡上的點刪掉,保留最多的波峰波谷

全局最優就是得到對多的波峰波谷,即最長的擺動序列

3.最大子序和

https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.html

這道題顯然可以暴力解出來,即列出所有子序和,找出最大的,不過計算量會比貪心大很多。

這里主要介紹貪心解的思想:

想要得到最大子序和,就得保證每次相加時,相加後不能為負數,因為負數繼續往下加一定是拉低總和的,那麼我們當加成到負數時就重新從下個數開始加,並實時記錄最大的子序和,這樣一遍循環就能得出最大子序和。

局部最優:加成負數就立刻停止,並從下個元素重新開始

全局最優:得到最大子序和

4.買賣股票的最佳時機II

https://programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII.html

思路:想要得到最大利潤,那就要低價買入高價賣出,那麼怎樣的買賣才能得到最大利潤呢。

這里就體現出貪心演算法的「貪」字(我猜的),這道題貪在哪呢,貪在只要有利可圖就去做,即只要今天買入的價錢比明天賣出的價錢底,即有利可圖,那麼我就去做,做就是在今天買入,在明天賣出。

局部最優:得到每天的最大正利潤

全局最優:得到最大利潤

5.跳躍游戲

https://programmercarl.com/0055.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8F.html

思路:每個數組的元素代表的是可以跳的最遠下標,那麼我們只要使那個最遠下標包含最後一個下標就是可以跳到,那麼我們每跳到一個位置就要更新那個可以跳的范圍,即可以跳到的最遠下標。

局部最優:每次跳躍都得出最遠的跳躍范圍

全局最優:最後能跳到的最大范圍

6.跳躍游戲II

https://programmercarl.com/0045.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8FII.html

思路:這道題要得到最小的跳躍數,其實只要保證跳的是位置是可以跳范圍內更新最遠范圍的位置就可以了。

為什麼這么說呢?以題例來說:

我們剛開始在『0』的位置,我們能跳到『1』和『2』的位置,那麼我們怎麼跳呢?可以看到跳到『1』之後更新的最大范圍是『4』,跳到『2』之後更新的最大范圍是『3』,所以我們就跳『2』了,因為跳『1』之後更新的最大可跳范圍更大包含了跳『2』的最大可跳范圍,那麼肯定是跳『3』最優呀,這里就體現了局部最優的思想。

局部最優:每次跳後,更新的最大可調范圍最大

全局最優:跳躍次數最少

7.K次取反後最大化的數組和

https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html

思路:想要得到最大數組和,我們就可以想到怎樣做呢?

一,盡可能保證負數最少

二,負數絕對值大的優先變正

三,正數絕對值小的優先變負,有零變零

本著這三條原則做,就能做出來。

那麼這道題體現了什麼貪心思想呢?

我感覺,前面那三條都是貪心中『貪』的體現

在負數中,局部最優就是:絕對值大的負數優先變正

在正數中,局部最優就是:絕對值小的正數變負,有零變零

得到的全局最優:數組和最大

8.加油站

https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html

思路:首先可以想到這道題是可以暴力解出來了,即分別以每個加油站為起點,得出可以跑一圈的加油站

那麼貪心思想做,該怎麼做呢,首先可以想到,如果以一個1點為起點當跑著跑著跑到3,油變為負數時,那麼說明以這個起點是不行的,但是以2或3為起點行不行呢?答案肯定是不行的,因為1跑到3,油變為負,說明1~3的gas=0的,所以可以得出,如果1~3油數變為負數,那麼由2~3油數肯定也為負數。

所以這里就可以得出,如果經過幾個加油站油數變為負了,那麼起點就更新為這一段路的下個加油站跑

局部最優:油量一旦為負,就從下個加油站重新跑

全局最優:得出可以跑一圈的加油站起點

9.分發糖果

https://programmercarl.com/0135.%E5%88%86%E5%8F%91%E7%B3%96%E6%9E%9C.html

思路:每個孩子至少一個,如果一個孩子比他旁邊的孩子優秀,就要比他旁邊的糖果多,這道題一旦兩邊都考慮很容易顧此失彼,所以我們就定義兩個循環,分別從左到右,從右到左去考慮,只要更優秀則比他旁邊的多1,如果已經多了就不用變了。

局部最優:保證優秀的孩子比他旁邊的孩子糖果多

全局最優:滿足題中條件,至少要發的糖果

10.檸檬水找零

https://programmercarl.com/0860.%E6%9F%A0%E6%AA%AC%E6%B0%B4%E6%89%BE%E9%9B%B6.html

思路:我們在找零時要遵守的規則一定是:

5 得5

10 得10減5

15 得15,優先減一個10減一個5  如果10塊沒有則減三個5

局部最優:以最少用的5塊的方式找零

全局最優:得到找零能否進行下去

❹ 數據結構之貪心演算法

貪婪演算法(Greedy)的定義:是一種在每一步選中都採取在當前狀態下最好或最優的選擇,從而希望導致結果是全局最好或最優的演算法。
貪婪演算法:當下做局部最優判斷,不能回退
(能回退的是回溯,最優+回退是動態規劃)
由於貪心演算法的高效性以及所求得答案比較接近最優結果,貪心演算法可以作為輔助演算法或解決一些要求
結果不特別精確的問題
注意:當下是最優的,並不一定全局是最優的。舉例如下:

有硬幣分值為10、9、4若干枚,問如果組成分值18,最少需要多少枚硬幣?
採用貪心演算法,選擇當下硬幣分值最大的:10
18-10=8
8/4=2
即:1個10、2個4,共需要3枚硬幣
實際上我們知道,選擇分值為9的硬幣,2枚就夠了
18/9=2
如果改成:

背包問題是演算法的經典問題,分為部分背包和0-1背包,主要區別如下:
部分背包:某件物品是一堆,可以帶走其一部分
0-1背包:對於某件物品,要麼被帶走(選擇了它),要麼不被帶走(沒有選擇它),不存在只帶走一部分的情況。
部分背包問題可以用貪心演算法求解,且能夠得到最優解。
假設一共有N件物品,第 i 件物品的價值為 Vi ,重量為Wi,一個小偷有一個最多隻能裝下重量為W的背包,他希望帶走的物品越有價值越好,可以帶走某件物品的一部分,請問:他應該選擇哪些物品?
假設背包可容納50Kg的重量,物品信息如下表:

將物品按單位重量 所具有的價值排序。總是優先選擇單位重量下價值最大的物品
按照我們的貪心策略,單位重量的價值排序: 物品A > 物品B > 物品C
因此,我們盡可能地多拿物品A,直到將物品1拿完之後,才去拿物品B,然後是物品C 可以只拿一部分.....

在不考慮排序的前提下,貪心演算法只需要一次循環,所以時間復雜度是O(n)

優點:性能高,能用貪心演算法解決的往往是最優解
缺點:在實際情況下能用的不多,用貪心演算法解的往往不是最好的

針對一組數據,我們定義了限制值和期望值,希望從中選出幾個數據,在滿足限制值的情況下,期望值最大。
每次選擇當前情況下,在對限制值同等貢獻量的情況下,對期望值貢獻最大的數據(局部最優而全局最優)
大部分能用貪心演算法解決的問題,貪心演算法的正確性都是顯而易見的,也不需要嚴格的數學推導證明
在實際情況下,用貪心演算法解決問題的思路,並不總能給出最優解

❺ 高分懸賞貪心演算法的作業

一、演算法思想

貪心法的基本思路:
——從問題的某一個初始解出發逐步逼近給定的目標,以盡可能快的地求得更好的解。當達到某演算法中的某一步不能再繼續前進時,演算法停止。
該演算法存在問題:
1. 不能保證求得的最後解是最佳的;
2. 不能用來求最大或最小解問題;
3. 只能求滿足某些約束條件的可行解的范圍。

實現該演算法的過程:
從問題的某一初始解出發;
while 能朝給定總目標前進一步 do
求出可行解的一個解元素;
由所有解元素組合成問題的一個可行解;

二、例題分析

1、[背包問題]有一個背包,背包容量是M=150。有7個物品,物品可以分割成任意大小。
要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。

物品 A
B
C
D
E
F
G

重量
35
30
60
50
40
10
25

價值
10
40
30
50
35
40
30

分析:

目標函數: ∑pi最大
約束條件是裝入的物品總重量不超過背包容量:∑wi<=M( M=150)

(1)根據貪心的策略,每次挑選價值最大的物品裝入背包,得到的結果是否最優?
(2)每次挑選所佔空間最小的物品裝入是否能得到最優解?
(3)每次選取單位容量價值最大的物品,成為解本題的策略。 ?

2、[單源最短路徑]一個有向圖G,它的每條邊都有一個非負的權值c[i,j],「路徑長度」就是所經過的所有邊的權值之和。對於源點需要找出從源點出發到達其他所有結點的最短路徑。

E.Dijkstra發明的貪婪演算法可以解決最短路徑問題。演算法的主要思想是:分步求出最短路徑,每一步產生一個到達新目的頂點的最短路徑。下一步所能達到的目的頂點通過如下貪婪准則選取:在未產生最短路徑的頂點中,選擇路徑最短的目的頂點。
設置頂點集合S並不斷作貪心選擇來擴充這個集合。當且僅當頂點到該頂點的最短路徑已知時該頂點屬於集合S。初始時S中只含源。
設u為G中一頂點,我們把從源點到u且中間僅經過集合S中的頂點的路稱為從源到u特殊路徑,並把這個特殊路徑記錄下來(例如程序中的dist[i,j])。
每次從V-S選出具有最短特殊路徑長度的頂點u,將u添加到S中,同時對特殊路徑長度進行必要的修改。一旦V=S,就得到從源到其他所有頂點的最短路徑,也就得到問題的解 。

stra.pas
3、[機器調度]現有N項任務和無限多台機器。任務可以在機器上處理。每件任務開始時間和完成時間有下表:

任務 a b c d e f g
開始(si) 0 3 4 9 7 1 6
完成(fi) 2 7 7 11 10 5 8

在可行分配中每台機器在任何時刻最多處理一個任務。最優分配是指使用的機器最少的可行分配方案。請就本題給出的條件,求出最優分配。

?三、練習題:
已知5個城市之間有班機傳遞郵件,目的是為了尋找一條耗油量較少的飛行路線。5個城市的聯系網路如圖所示。圖中編號的結點表示城市,兩個城市之間的連線上的值表示班機沿該航線已行的耗油量,並假定從城市i到j和城市j到i之間的耗油量是相同的。

分析:
1. 運用貪心思想:
在每一步前進的選擇上,選取相對當前城市耗油量最小的航線;
2. 圖解:若從1出發,有圖:

總耗油量=14 1-2-5-3-4-1
但若路線改為:1-5-3-4-2-1,則總耗油量=13
所以,這樣的貪心法並不能得出最佳解。
3. 改善方案:
從所有城市出發的信心過程,求最優的。

編程
1. 數據結構:
城市聯系網路圖的描述(圖的鄰接矩陣的描述):
const
c=array[1..5,1..5] of integer=((0,1,2,7,5),
(1,0,4,4,3),
(2,4,0,1,2),
(7,4,1,0,3));
2. 貪心過程:
begin
初始化所有城市的算途徑標志;
設置出發城市V;
for i:=1 to n-1 do {n-1個城市}
begin
s:=從V至所有未曾到過的城市的邊集中耗油量最少的那個城市;
累加耗油量;
V:=s;
設V城市的訪問標志;
end;
最後一個城市返回第一個城市,累加耗油量;
end;
3. 主過程:實現改善方案
begin
for i:=1 to n do
begin
cost1:=maxint; {初始化}
調用貪心過程,返回本次搜索耗油量cost;
if cost<cost1 then 替換;
end;
輸出;
end

❻ 關於編程的貪心法

定義
所謂貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的局部最優解。 貪心演算法不是對所有問題都能得到整體最優解,但對范圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。
[編輯本段]貪心演算法的基本思路
1.建立數學模型來描述問題。 2.把求解的問題分成若干個子問題。 3.對每一子問題求解,得到子問題的局部最優解。 4.把子問題的解局部最優解合成原來解問題的一個解。 實現該演算法的過程: 從問題的某一初始解出發; while 能朝給定總目標前進一步 do 求出可行解的一個解元素; 由所有解元素組合成問題的一個可行解。 下面是一個可以試用貪心演算法解的題目,貪心解的確不錯,可惜不是最優解。
[編輯本段]例題分析
[背包問題]有一個背包,背包容量是M=150。有7個物品,物品不可以分割成任意大小。 要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。 物品 A B C D E F G 重量 35 30 60 50 40 10 25 價值 10 40 30 50 35 40 30 分析: 目標函數: ∑pi最大 約束條件是裝入的物品總重量不超過背包容量:∑wi<=M( M=150) (1)根據貪心的策略,每次挑選價值最大的物品裝入背包,得到的結果是否最優? (2)每次挑選所佔重量最小的物品裝入是否能得到最優解? (3)每次選取單位重量價值最大的物品,成為解本題的策略。 值得注意的是,貪心演算法並不是完全不可以使用,貪心策略一旦經過證明成立後,它就是一種高效的演算法。 貪心演算法還是很常見的演算法之一,這是由於它簡單易行,構造貪心策略不是很困難。 可惜的是,它需要證明後才能真正運用到題目的演算法中。 一般來說,貪心演算法的證明圍繞著:整個問題的最優解一定由在貪心策略中存在的子問題的最優解得來的。 對於例題中的3種貪心策略,都是無法成立(無法被證明)的,解釋如下: (1)貪心策略:選取價值最大者。 反例: W=30 物品:A B C 重量:28 12 12 價值:30 20 20 根據策略,首先選取物品A,接下來就無法再選取了,可是,選取B、C則更好。 (2)貪心策略:選取重量最小。它的反例與第一種策略的反例差不多。 (3)貪心策略:選取單位重量價值最大的物品。 反例: W=30 物品:A B C 重量:28 20 10 價值:28 20 10 根據策略,三種物品單位重量價值一樣,程序無法依據現有策略作出判斷,如果選擇A,則答案錯誤。 【注意:如果物品可以分割為任意大小,那麼策略3可得最優解】 對於選取單位重量價值最大的物品這個策略,可以再加一條優化的規則:對於單位重量價值一樣的,則優先選擇重量小的!這樣,上面的反例就解決了。 但是,如果題目是如下所示,這個策略就也不行了。 W=40 物品:A B C 重量:28 20 15 價值:28 20 15 附:本題是個NP問題,用貪心法並不一定可以求得最優解,以後了解了動態規劃演算法後本題就有了新的解法。
[編輯本段]備注
貪心演算法當然也有正確的時候。求最小生成樹的Prim演算法和Kruskal演算法都是漂亮的貪心演算法。 所以需要說明的是,貪心演算法可以與隨機化演算法一起使用,具體的例子就不再多舉了。(因為這一類演算法普及性不高,而且技術含量是非常高的,需要通過一些反例確定隨機的對象是什麼,隨機程度如何,但也是不能保證完全正確,只能是極大的幾率正確)
[編輯本段]附貪心演算法成功案例之一
馬踏棋盤的貪心演算法 123041-23 XX 【問題描述】 馬的遍歷問題。在8×8方格的棋盤上,從任意指定方格出發,為馬尋找一條走遍棋盤每一格並且只經過一次的一條最短路徑。 【初步設計】 首先這是一個搜索問題,運用深度優先搜索進行求解。演算法如下: 1、 輸入初始位置坐標x,y; 2、 步驟 c: 如果c> 64輸出一個解,返回上一步驟c-- (x,y) ← c 計算(x,y)的八個方位的子結點,選出那此可行的子結點 循環遍歷所有可行子結點,步驟c++重復2 顯然(2)是一個遞歸調用的過程,大致如下: void dfs(int x,int y,int count) { int i,tx,ty; if(count> N*N) { output_solution();//輸入一個解 return; }

閱讀全文

與貪婪演算法基本的解題思路是什麼相關的資料

熱點內容
雲空間在哪個文件夾 瀏覽:924
編程游戲小貓抓小魚 瀏覽:782
安卓dosbox怎麼打開 瀏覽:772
伺服器無影響是怎麼回事 瀏覽:950
比德電子采購平台加密 瀏覽:200
加密貨幣400億 瀏覽:524
植發2次加密 瀏覽:44
vc6查看編譯的錯誤 瀏覽:595
心理大全pdf 瀏覽:1002
區域鏈加密幣怎麼樣 瀏覽:343
查找命令符 瀏覽:95
壓縮工具zar 瀏覽:735
白盤怎麼解壓 瀏覽:475
辰語程序員學習筆記 瀏覽:47
程序員被公司勸退 瀏覽:523
java三子棋 瀏覽:693
加密空間怎麼強制進入 瀏覽:345
ug分割曲線命令 瀏覽:209
學碼思程序員 瀏覽:610
自考雲學習app為什麼登不上 瀏覽:410