遞迴 揹包問題

2021-08-31 08:38:11 字數 1068 閱讀 2557

揹包問題有許多種形式,最簡單的揹包問題形式:現在有一堆石頭,(比如重量為2,6,8,10),乙個揹包中可以裝指定的重量(比如14)的石頭,請問揹包中可以放入的石頭的組合。

**中假設石頭是個源陣列,揹包是目標陣列。

演算法中使用分治的想法將此問題遞迴為兩個小範圍的問題。

針對第n個石頭,揹包問題可以分解為兩種組合的何:含第n個石頭的揹包的組合,與不含n個石頭的揹包的組合,

1.假設含第n個石頭,揹包問題變為,針對剩下的石頭求得總重量減去第n個石頭的重量的揹包問題。

2.不含n個石頭,揹包問題變為針對剩下的石頭求得總重量的揹包問題。

class bag ;

select(14,src, 0, new int[src.length]); }

/*** @param total 總數

* @param src 源資料陣列

* @param offset 源陣列的起始位置

* @param bag 揹包,裝選中的資料

*/private static void select(int total, int src, int offset, int bag)

//從起始值開始尋找第乙個小於要求增加重量的數值

while(offset < src.length && total < src[offset]) offset++;

if(offset >= src.length) return; //當沒有源資料可以選擇,則退出

//將問題化簡為在剩下的源資料中,兩個找到重量的問題

select(total,src,offset+1,bag.clone()); //揹包中不含有offset位置的

select(total-src[offset],src,offset+1,put(bag,src[offset]));//揹包中含有offset位置的 }

private static int put(int bag, int n)

private static void print(int bag)

system.out.println();

}}

0 1揹包問題(遞迴解決)

問題剖析 0 1揹包問題規定每個物品要麼選,要麼不選。因此可以設定物品選擇向量為y y1,y2,yn 那麼當yn 1時,y y1,y2,yn 1 必然為f n 1,c wn 的物品選擇向量,當yn 0時,必然為f n 1,c 的最優物品選擇向量。所以此時可以考慮動態規劃解法。得到根據上面的分析,我們...

01揹包問題 遞迴實現

問題描述 乙個揹包裡可以放入重量為 weight 的物品,現有 n 件物品的集合 s,其中物品的重量分別為 w0,w1.求解 假設如果不選最後一件物品 其重量是 如果選擇最後一件物品,那麼如果 def knap weight,wlist,n weight為包的容量,wlist是乙個所有重量的表,n為...

遞迴法解決揹包問題

演算法思想 1 如果在某個時刻,選擇的資料項符合目標重量,那麼工作便完成了 2 從選擇的第乙個資料項開始,剩餘的資料量的加和必須符合揹包的目標量減去 第乙個資料項的重量,這是乙個新的目標重量 3 逐個嘗試組合剩餘資料項的可能性,但是注意不要嘗試所有的組合,因為只要資料項的和大於目標重量的時候,就會停...