0 1揹包問題

2021-08-29 02:14:48 字數 1146 閱讀 9439

1.  蠻力法

偽**:

輸入:重量,價值 ,揹包容量c

輸出:裝入揹包的物品編號和最大價值

1. 初始化最大價值maxvalue=0;結果子集s=φ;

2. 對集合的每個子集t,執行下述操作;

2.1 初始化揹包的價值value=0;揹包的重量weight=0;

2.2 對子集t的每乙個元素;

2.2.1 如果weight+wj演算法效率:ω(2^n)

2.  動態規劃法

演算法實現:

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

else

x[i]=0;

}return v[n][c]; //返回揹包取得的最大價值

}/*

設n個物品的重量儲存在陣列w[n]中,價值儲存在陣列v[n]中;

揹包的容量為c,陣列v[n+1][c+1]存放迭代結果,其中v[i][j]表示前i個物品裝入容量為j的揹包中獲得的

最大價值,陣列x[n]儲存裝入揹包的物品

*/

時間複雜性:o(n*c);

3. 分支限界法

偽**:

輸入: 重量,價值 ,揹包容量c

輸出: 揹包獲得的最大價值和裝入揹包的物品

1. 根據限界函式計算目標函式的上界up;採用貪婪法得到下界down;

2. 根據根結點的目標函式值並加入待處理結點表pt;

3. 迴圈直到某個葉子節點的目標函式值在表pt中取得的最大值

3.1 i=表pt中具有最大值的結點;

3.2 對節點i的每個孩子結點x執行以下操作:

3.2.1 如果結點x不滿足約束條件,則丟棄該節點;

3.2.2 否則估算結點x的目標函式值lb,將結點x將入錶pt中;

4. 將葉子結點對應的最優值輸出,回溯求得最優解的各個分量.

/* 設n個物品的重量儲存在陣列w[n]中,價值儲存在陣列v[n]中;

揹包的容量為c,陣列v[n+1][c+1]存放迭代結果,其中v[i][j]表示前i個物品裝入容量為j的揹包中獲得的

最大價值,陣列x[n]儲存裝入揹包的物品

*/

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...

揹包問題 01揹包

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...