分支限界法01揹包問題 01揹包問題

2021-10-18 02:04:16 字數 1901 閱讀 1054

1.01揹包問題的描述

有n個不可分割的物品,它們有各自的重量和價值,現有固定容量的揹包,選擇把哪些物品放入揹包可以讓揹包中物品的價值最大。

2.錯覺

按照價值和重量的比值(價效比)進行排序,依次嘗試放入直到放不進揹包為止。但是細想思考一下就能發現,這個貪心演算法是有問題的,看下面乙個例子。揹包容量10kg,有3物品: ,, 。如果使用貪心演算法,得出如下圖的結果,這顯然不行。

3.正確的解法

3.1 簡單粗暴的方式:

把每種可能性都嘗試一次。有n個物品,每個物品有兩種選擇(放入揹包,不放入揹包)。一共有2的n次方種可能。每種可能計算出總重量和總價值,在滿足揹包重量的可能情況中選擇出價值最大的。

3.2 問題分解/動態規劃:

3.2.1 動態規劃的基本思路:

動態規劃的基本思想是將待求解的問題分解成若干子問題,先求解子問題,然後從子問題的解得到原問題的解。我們可以用乙個**來記錄所有已解的子問題的答案。不管該子問題以後是否被用到,只要它被計算過,就將其結果填入**中。這就是動態規劃法的基本思路。

3.2.2 使用動態規劃的思路進行思考:

n個物品,編號分別從1到n(無需排序)。

1.處理第乙個物品,處理的過程很簡單,把揹包容量是0到揹包總量的情況都計算出揹包最大能容納下的價值。

2.考慮怎麼在已經存在了部分解的情況下繼續找出最大價值。處理2到n物品時,情況類似。都是基於已經有部分解的情況下進行處理。把當前處理的物品標記為物品i。下面分析i是怎麼處理的,然後讓i從2到n依次的進行處理。處理第i個物品有兩種情況(和處理物品1時情況一樣):

a.揹包放不下物品i (揹包的總容量,而不是剩餘空間),i最優解和i-1的最優解一樣

b.揹包放得下物品i(分兩種情況):

b.1.不把i放入揹包,價值和i-1一樣

b.2.把i放入揹包,在i-1的揹包問題解中,去除i的重量,然後把i加進去,

對b中的兩種情況分別進行計算,在兩者中選出大的那個值,f[i,j] = max。(注:j是揹包的容量,f[i,j]是揹包容量為j處理到i物品時的最大價值,wi時i物品的重量,pi時i物品的價值)

3.2.3 做個**試試吧:

4.延伸一下

4.1 多重揹包問題

和01揹包問題的區別是,第i件物品有 n[i]件(不止一件)。這個問題可以通過轉換變成01揹包來處理。把物品i的多件物品當作不同的物品進行處理。從新編號成每個物品都有唯一的編號,就變成了01揹包問題。

4.2 完全揹包問題

和01揹包類似,不同的是每件物品數量無限。把他轉換成多重揹包進行處理。把i物品的數量從無限轉換成有限。轉換的方式為揹包只放i物品能放下幾個,這是物品i的件數。

5.思考

通過最後的**,是否能看出來,哪件物品被選中了。如果能看出來說明理解了。

6.後續

可能會講一下紅黑樹是怎麼調節平衡的,linux的夥伴系統,或者是矩陣運算規則。

0 1揹包問題 分支限界法

0 1揹包問題可描述為 n個物體和乙個揹包。對物體i,其價值為value,重量為weight,揹包的容量為w 如何選取物品裝入揹包,使揹包中所裝入的物品總價值最大?2.1 用到的資料結構 class goods 定義貨物資料型別 class knapsack 揹包 2.2 演算法步驟1 定 空間。x...

分支限界法 0 1揹包問題

分支限界法類似於回溯法,也是在問題的解空間上搜尋問題解的演算法。一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出解空間中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種意義下的最優解...

0 1揹包問題(分支限界法)

需求分析 0.問題描述 給定一揹包的容量c,和n個物品的重量wi價值vi,求在揹包容量允許的條件下能裝入的最大價值 1.問題分析 解空間 子集樹,第i層每個節點有兩棵子樹 選擇物品i,不選擇物品i 優先佇列的優先順序如何確定?每個節點的祖先節點都已經確定,那麼可以得到已經裝入揹包的物品的價值,加上剩...