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...