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