揹包問題

《算法設計與分析基礎》 之 窮舉查找

對於揹包問題,窮舉查找算法對於任何輸入都是很是低效率的。git

旅行商問題和揹包問題是NP困難問題中最著名的例子。github

對於NP困難問題,目前沒有已知的效率能夠用多項式來表示的算法。算法


《算法的樂趣》 之 0-1揹包問題

0-1 揹包問題在題目中隱含了一個條件,就是每一個物品只有一件,只能選擇 0 個或 1 個,所以得名 0-1 揹包問題。ui

三種常見的貪婪策略設計

  1. 根據物品價值,每次都選價值最高的物品
  2. 根據物品重量,每次都選重量最輕的物品
  3. 定義價值密度的概念,每次都選價值密度高的物品

以上是解題的第一步,定義數學模型。接下來進行高度抽象。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揹包問題 徹底揹包問題 多重揹包問題 二維費用揹包問題

相關文章
相關標籤/搜索