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