對於揹包問題,窮舉查找算法對於任何輸入都是很是低效率的。git
旅行商問題和揹包問題是NP困難問題中最著名的例子。github
對於NP困難問題,目前沒有已知的效率能夠用多項式來表示的算法。算法
0-1 揹包問題在題目中隱含了一個條件,就是每一個物品只有一件,只能選擇 0 個或 1 個,所以得名 0-1 揹包問題。ui
三種常見的貪婪策略設計
以上是解題的第一步,定義數學模型。接下來進行高度抽象。code
其實,根據哪一個條件來選擇物品,歸根結底就是根據哪一個條件來進行排序。根據既定的順序,依次將物品取入揹包中,但要在每次取以前先判斷揹包是否還能裝得下。排序
1. 根據物品價值降序get
sort(goods.begin(), goods.end(), [](const Goods& lhs, const Goods& rhs) { return lhs.price > rhs.price; });
2. 根據物品重量升序數學
sort(goods.begin(), goods.end(), [](const Goods& lhs, const Goods& rhs) { return lhs.weight < rhs.weight; });
3. 根據物品密度升序it
sort(goods.begin(), goods.end(), [](const Goods& lhs, const Goods& rhs) { return (lhs.price / lhs.weight) > (rhs.price / rhs.weight); });
對於一些可以證實貪婪策略獲得的就是最優解的問題,應用貪婪法能夠高效地求得結果,好比最小生成樹的 Pirm 算法和 Kruskal 算法。
大多數狀況下,貪婪法只能獲得比較接近最優解的近似最優解。做爲一種啓發式輔助方法,它經常使用於其餘算法中,好比 Dijkstra 的單源最短路徑算法。
在任何算法中,只要在某個階段使用了只考慮局部最優解狀況的選擇策略,均可以理解爲使用了貪婪算法。
《揹包九講》 01揹包問題 徹底揹包問題 多重揹包問題 二維費用揹包問題