剖析 0 1揹包演算法

2021-08-02 20:50:06 字數 827 閱讀 8921

何為0-1揹包?通俗的講就是揹包問題,乙個包要麼背這件物品,要麼不背這件物品,0和1體現了要麼背要麼就不背,每件物品都有重量和價值,怎樣選擇物品才能獲得最大點的價值,這個問題我們可以通過動態規劃的方法進行巧妙的解決。

我們用當前得物品重量和包的剩餘重量進行比較,如果書包剩餘重量小於當前的物品重量,就直接進行下乙個武平的匹配,如果書包剩餘重量大於當前物品重量,有兩種選擇,要麼裝,要麼不裝,這個選擇體現它的價值,通過遞迴很巧妙的實現了這個思想,**如下:

int count2 = 0;

int knapsack(int *w, int *v, int i, int len, int weight)

} return 0;

}

我們發現這個**有很多的重複計算,那麼怎麼樣消除重複項呢?我們借助二維陣列,**如下:

int count1 = 0;

int knapsack_e(int *w, int *v, int i, int n, int j, int **m)

else if (m[i][j] > 0) return m[i][j];

return m[i][j];

}}

這兩個都是遞迴實現,那麼迴圈的方法怎樣實現呢?**如下:

int count3;

int knapsack1(int *w, int *v, int **c, int n,int weight)

for (i = n - 1; i >= 1; i--)

}} return c[1][weight];

}

01揹包演算法

核心 狀態轉換方程 01揹包問題 容量為10的揹包,有5種物品,每種物品只有乙個,其重量分別為5,4,3,2,1,其價值分別為1,2,3,4,5。設計演算法,實現揹包內物品價值最大。如下 輸出14 include include using namespace std int main int v ...

演算法 01揹包

揹包最大容量10,有以下5個商品及其價值,試求揹包所能容納的最大價值。序號1 2345 重量226 54價值6 3546 如下 include include define max v 100 using namespace std struct good 動態規劃求解 n 商品個數 m 揹包最大重...

01揹包演算法

01揹包問題 動態規劃的基本思想 動態規劃演算法可分解成從先到後的4個步驟 1.描述乙個最優解的結構,尋找子問題,對問題進行劃分。2.定義狀態。往往將和子問題相關的各個變數的一組取值定義為乙個狀態。某個狀態的值就是這個子問題的解 若有k個變數,一般用k維的陣列儲存各個狀態下的解,並可根 據這個陣列記...