0 1揹包 回溯法(附陣列法和構建類法)

2021-08-20 04:06:22 字數 1607 閱讀 9947

0-1揹包--回溯法

本文附加兩種方法,陣列法和構建類法,兩種方法解題思路原理相同。

問題描述:

給定n個物品和乙個揹包。物品

i的重量為

wi,價值為

vi,揹包容量為c。

如何選擇裝入揹包中的物品,使得裝入揹包的物品的價值最大?

函式、陣列宣告:

n物品的個數

c揹包的容量

bestp最大價值

i第i個物品

cp當前包內物品價值

cw當前包內物品重量

w[i] 物品的重量

v[i]物品的價值

x[i]暫存物品的選中情況

beatx[i]物品的選中情況

演算法描述:

當需要找出問題的解集,或者要求回答什麼解是滿足某些約束條件的最佳解時,往往要使用回溯法。

回溯法的基本做法是搜尋,或是一種組織得井井有條的,能避免不必要搜尋的窮舉式搜尋法。這種方法適用於解一些組合數相當大的問題

在問題的解空間樹中,回溯法按深度優先策略,從根結點出發搜尋解空間樹。

在搜尋解空間樹時,只要左兒子結點是乙個可行的結點,搜尋就進入其左子樹。當右子樹中有可能有包含最優解時才進入右子樹搜尋。否則將右子樹減去。

為了便於計算 上界,可先將物品依其單位重量價值從大到小排序 ,此後只要按順序考察各物品即可。在實現時,由bound計算當前結點處的上界。類knap的資料成員記錄解空間樹中的結點資訊,以減少引數傳遞及遞迴呼叫所需的棧空間。在解空間樹的當前擴充套件結點處,僅當進人右子樹時才計算上界bound,以判斷是否可將右子樹剪去。進人左子樹時不需計算上票,因為其上界與其父結點的上界相同。

陣列法**實現:

#includeusing namespace std;

int n,c,x[1010],v[1010],w[1010],bestx[1010];

int sum=0;

void backtrack(int i,int cp,int cw)

}else}}

}int main()

return ;

}if(cw+w[i]<=c)//搜尋左子樹

if(bound(i+1)>bestp)//搜尋右子樹

}class object

private:

int id;

float d;

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

if(w<=c) //裝入所有物品

return v;

//依物品單位重量價值排序,氣泡排序

01揹包回溯法

計算機演算法基礎 第三版 余祥宣 崔國華 等 華中科技大學出版社 中回溯法解決01揹包問題 演算法思想 基於貪心演算法的回溯演算法 w p陣列是按照效益p w拍好序的陣列 include const int n 8 物品個數 const int m 110 int w n 1 重量陣列,從1開始 i...

0 1揹包(回溯法)

描述 需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi 價值為pi 對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。輸入 多個測例,每個測例的輸入佔三行。第一行兩個整數 n n 10 和c,第二行n個整數分別是w1到...

0 1揹包 回溯法

include include include using namespace std define n 100000 int n,c int cp 0,cw 0,bestp 0 cp是當前價值,cw是當前重量,bestp是當前最優值。int w n p n x n bestx n bestx陣列是...