有n種可選物品1,…,n ,放入容量為c的揹包內,使裝入的物品具有最大效益。
表示n :物品個數
c :揹包容量
p1,p2, …, pn:個體物品效益值
w1,w2, …,wn:個體物品容量
0-1揹包問題的解指:物品1,…,n的一種放法(x1, ···,xn的0/1賦值),使得效益值最大。
假定揹包容量不足以裝入所有物品:面臨選擇
【優化原理】無論優化解是否放物品1,優化解對物品2,…,n的放法,相對剩餘揹包容量,也是優化解。
首先給出所需要的變數:
```private static int p;//物品的價值陣列
private static int w;//物品的重量陣列
private static int c;//最大可以拿的重量
private static int count;//物品的個數
private static int cw;//當前的重量
private static int cp;//當前的價值
static int bestp;//目前最優裝載的價值
private static int r;//剩餘物品的價值
private static int cx;//存放當前解
private static int bestx;//存放最終解
```解空間樹:子集樹
可行性約束條件:cw + w[t] < c
上界函式:cp + r <= bestp,即如果當前結點滿足這個條件時,就可以將該結點的右子樹剪去。
```
/** * 回溯
* @param t
*/public static void backtrack(int t)
bestp = cp;
}return;
}r -= p[t];
if(cw + w[t] <= c)
if(cp + r >bestp)
r += p[t];//恢復現場
}```
```
package sort;
public class zero_one
//呼叫回溯法計算
backtrack(1);
return bestp;
}/**
* 回溯
* @param t
*/public static void backtrack(int t)
bestp = cp;
}return;
}r -= p[t];
if(cw + w[t] <= c)
if(cp + r >bestp)
r += p[t];//恢復現場
}public static void main(string args) ;
int p1 = ;
int c1 = 30;
loading(w1,p1,c1);
system.out.println("最優裝載為:" + bestp);
回溯演算法 01揹包問題 Java實現
回溯演算法也叫試探法,通俗的將就是乙個方向的路一直往前走,能走則走,不能走則退回來換乙個方向再試。一般的實現步驟是 針對乙個問題定 的空間,至少包含問題的乙個最優解 用易於搜尋的解空間結構,使得能用回溯方法搜尋整個解空間 以深度優先的方式搜尋整個解空間,並在搜尋過程中通過剪枝函式避免無效搜尋。如上圖...
回溯演算法 0 1揹包問題
給定乙個物品集合s 1,2,3,n 物品i的重量是wi,其價值是vi,揹包的容量為w,即最大載重量不超過w。在限定的總重量w內,我們如何選擇物品,才能使得物品的總價值最大。0 1揹包問題回溯演算法的資料結構 define num 100 int c 揹包的容量 int n 物品的數量 int cw ...
回溯演算法 01揹包問題
假期 2020.01 200 1揹包問題一般描述為 給定n種物品和乙個揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?注 每個物品只能使用一次。這次分析01揹包問題,採用回溯的方法實現。簡單的來說,回溯就是採用dfs然後加上...