算法设计与分析(第四周)贪心算法、背包问题
貪心算法
顧名思義,貪心算法總是作出在當前看來最好的選擇。也就是說貪心算法并不從整體最優考慮,它所作出的選擇只是在某種意義上的局部最優選擇。當然,希望貪心算法得到的最終結果也是整體最優的。
雖然貪心算法不能對所有問題都得到整體最優解,但對許多問題它能產生整體最優解。如單源最短路經問題,最小生成樹問題等。在一些情況下,即使貪心算法不能得到整體最優解,其最終結果卻是最優解的很好近似。
例:用貪心法求解付款問題
假設有面值為5元、2元、1元、5角、2角、1角的貨幣,需要找給顧客4元6角現金,為使付出的貨幣的數量最少首先選出1張面值不超過4元6角的最大面值的貨幣,即2元,再選出1張面值不超過2元6角的最大面值的貨幣,即2元再選出1張面值不超過6角的最大面值的貨幣,即5角,再選出1張面值不超過1角的最大面值的貨幣,即1角總共付出4張貨幣。
總結起來,本題要求如下:
面值:5元 2元 1元 5角 2角 1角
需要付款:4元6角
貪心思想
在付款問題每一步的貪心選擇中,在不超過應付款金額的條件下,只選擇面值最大的貨幣,而不去考慮在后面看來這種選擇是否合理,而且它還不會改變決定:一旦選出了一張貨幣,就永遠選定。付款問題的貪心選擇策略是盡可能使付出的貨幣最快地滿足支付要求,其目的是使付出的貨幣張數最慢地增加,這正體現了貪心法的設計思想。
但是這種貪心思想并非對于任何問題都有效。比如,面值變成如下情況:
面值:10元 7元 5元 1元
需要付款:12元
貪心算法結果:10元+1元+1元
實際上最優情況:7元+5元
分析后我認為,當任一級別錢幣面值*2>高一級別錢幣面值時,貪心算法不能在任意付款需求時給出全局最優解。(個人想法)
貪心算法的設計思路
貪心算法的設計思路是:總是做出在當前看來最好的選擇,即貪心算法并不是從整體最優考慮,它所做的選擇只是在某種意義上的局部最優選擇。
貪心算法的基本要素
貪心算法與0-1背包問題
手動證明0-1背包問題具有最優子結構:
以下為假設背包容量與物品狀態
以下為反證法
0-1背包問題不具有貪心選擇性質。
原因是無法保證能夠將背包裝滿,而所剩空間降低了背包的總價值。
背包問題具有貪心選擇性質。
用貪心算法解背包問題的基本步驟
1.計算每種物品單位重量的價值 Vi/Wi;
2.按照單位重量的價值從高到低的順序排序;
3.依據貪心選擇策略,按照單位價值從高到低的順序,依次將盡可能多的物品裝入背包中。直到背包裝滿為止。是否可以將物品裝入背包的條件是:有空間
偽代碼
總結
以上是生活随笔為你收集整理的算法设计与分析(第四周)贪心算法、背包问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编MIPS指令集 add两数相加、sy
- 下一篇: Logisim 一个PLA电路