经典的01背包问题
01背包問題具體例子:
假設(shè)現(xiàn)有容量10kg的背包,另外有3個物品,分別為a1,a2,a3。物品a1重量為3kg,價(jià)值為4;物品a2重量為4kg,價(jià)值為5;物品a3重量為5kg,價(jià)值為6。將哪些物品放入背包可使得背包中的總價(jià)值最大?
這個問題有兩種解法,動態(tài)規(guī)劃和貪婪算法。本文僅涉及動態(tài)規(guī)劃。
先不套用動態(tài)規(guī)劃的具體定義,試著想,碰見這種題目,怎么解決?
首先想到的,一般是窮舉法,一個一個地試,對于數(shù)目小的例子適用,如果容量增大,物品增多,這種方法就無用武之地了。
其次,可以先把價(jià)值最大的物體放入,這已經(jīng)是貪婪算法的雛形了。如果不添加某些特定條件,結(jié)果未必可行。
最后,就是動態(tài)規(guī)劃的思路了。先將原始問題一般化,欲求背包能夠獲得的總價(jià)值,即欲求前i個物體放入容量為m(kg)背包的最大價(jià)值c[i][m]——使用一個數(shù)組來存儲最大價(jià)值,當(dāng)m取10,i取3時,即原始問題了。而前i個物體放入容量為m(kg)的背包,又可以轉(zhuǎn)化成前(i-1)個物體放入背包的問題。下面使用數(shù)學(xué)表達(dá)式描述它們兩者之間的具體關(guān)系。
表達(dá)式中各個符號的具體含義。
總結(jié)
- 上一篇: shell之a+b求和l脚本的三种写法
- 下一篇: 经典排序之插入排序