01揹包演算法 動態規劃(c 實現)

2021-07-10 20:17:20 字數 1181 閱讀 4375

0-1揹包問題:給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。

問應如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?

在選擇裝入揹包的物品時,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能將物品i裝入揹包多次,也不能只裝入部分的物品i。因此,該問題稱為0-1揹包問題。

已知5個物品的0/1揹包問題例項:n=5, v=[6,3,5,4,6], w=[2,2,6,5,4], c=10。

下面**用兩種方法計算,其大體思路是相同的。推薦使用第二種方法,即knapsacktwo()

#include#includeusing namespace std;

int table[10][100]=;

int tabletwo[10][100];

int flag[10]=;

int knapsack(int v,int w,int c,int n)

}} return table[n][c];

} int knapsacktwo(int v,int w,int c,int n)

tabletwo[1][c]=tabletwo[2][c];//先假設1物品不裝

if(c>=w[1])tabletwo[1][c]=max(tabletwo[1][c],tabletwo[2][c-w[1]]+v[1]);//根據價值,判斷到底裝不裝

return tabletwo[1][c];//返回最優值

} void traceback(int w,int c,int n){//根據最優值,求最優解

for(int i=1;i總價值最大為:"總價值最大為:"總價值最大為:15

第二種方法->總價值最大為:15

最優值的解:1 1 0 0 1

0 0 0 0 0 0 0 0 0 0 15

0 0 3 3 6 6 9 9 9 10 11

0 0 0 0 6 6 6 6 6 10 11

0 0 0 0 6 6 6 6 6 10 10

0 0 0 0 6 6 6 6 6 6 6

*/

演算法之動態規劃 0 1揹包

經典的盜賊問題 乙個盜賊帶著乙個揹包去偷東西,房中有五件物品 1 6公斤 48元 2 5公斤 40元 3 2公斤 12元 4 1公斤 8元 5 1公斤 7元 但是他的揹包只能裝下8攻擊的東西 問他該怎樣選擇保障拿到的東西價值最大。思路 使用動態規劃來實現,1.將物品i 放到揹包裡面,修改選擇標誌 2...

演算法 動態規劃0 1揹包問題

有乙個容量為 n 的揹包,要用這個揹包裝下物品的價值最大,這些物品有兩個屬性 體積 w 和價值 v。定義乙個二維陣列 dp 儲存最大價值,其中 dp i j 表示前 i 件物品體積不超過 j 的情況下能達到的最大價值。設第 i 件物品體積為 w,價值為 v,根據第 i 件物品是否新增到揹包中,可以分...

動態規劃 01揹包

最優二叉查詢樹.cpp 定義控制台應用程式的入口點。01揹包問題。include stdafx.h include include define n 3 the number of real node define m 10 using namespace std int tmain int arg...