0 1揹包問題 回溯演算法 java實現

2021-08-19 06:43:41 字數 1741 閱讀 1744

有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然後加上...