閱讀下列說明,回答問題1至問題2,將解答填入答題紙的對應欄內。
【說明】
0—1背包問題可以描述為:有n個物品,對i=l,2,…,n,第i個物品價值為vi,重量為wi(vi和wi為非負數),背包容量為w(W為非負數),選擇其中一些物品裝入背包,使裝入背包物品的總價值最大,即
,且總重量不超過背包容量,即
,其中,xi∈{O,1},xi=0表示第i個物品不放入背包,xi=1表示第i個物品放入背包。
用回溯法求解此0—1背包問題,請填充下面偽代碼中(1)~(4)處空缺。
回溯法是一種系統的搜索方法。在確定解空間后,回溯法從根結點開始,按照深度優先策略遍歷解空間樹,搜索滿足約束條件的解。對每一個當前結點,若擴展該結點已經不滿足約束條件,則不再繼續擴展。為了進一步提高算法的搜索效率貪心算法部分背包問題,往往需要設計一個限界函數,判斷并剪枝那些即使擴展了也不能得到最優解的結點。現在假設已經設計了BOuND(v,w,k,W)函數,其中v、w、k和w分別表示當前已經獲得的價值、當前背包的重量、已經確定是否選擇的物品數和背包的總容量。對應于搜索樹中的某個結點,該函數值表示確定了部分物品是否選擇之后,對剩下的物品在滿足約束條件的前提下進行選擇可能獲得的最大價值,若該價值小于等于當前已經得到的最優解,則該結點無需再擴展。下面給出0—1背包問題的回溯算法偽代碼。
函數參數說明如下:w:背包容量;n:物品個數;w:重量數組;v:價值數組;fw:獲得最大價值時背包的重量;fp:背包獲得的最大價值;X:問題的最優解。
變量說明如下:
cw:當前的背包重量;cp:當前獲得的價值;k:當前考慮的物品編號;Y:當前已獲得的部分解。
BKNAP(W,n,w,v,fw,fp貪心算法部分背包問題,X)
1 cw←cp0
2 (1)
3 fp←l
4 while true
5 while k≤n and cw+w[k]≤w d。
6 (2)
7 cp←cp+v[k]
8 Y[k]←l
9 k←k+1
10 if k>n then
11 if fp12 fp←cp
13 fw←cw
14 k←n
15 X←Y
16 else Y (k)←O
17 while BOUND(cp,cw,k,W) ≤fp do
18 while k≠O and Y(k)≠l d0
19 (3)
20 if k=0 then
2l Y[k]←0
22 cw←cw-w[k]
23 cp←cp-v[k]
24 (4)
請幫忙給出正確答案和分析,謝謝!