揹包問題2 完全揹包

2021-07-05 18:33:11 字數 1459 閱讀 4384

一,題目:

有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c[i],價值是w[i]。

求解將哪些物品裝入

揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

二,基本思路:

從每種物品的角度考慮,與它相關的策略已並非取或不取兩種,而是有取0件、取1件、取2件……等很多種。

令f[i][v]表示前i種物品恰放入乙個容量為v的揹包的最大權值。仍然可以按照每種物品不同的策略寫出狀態轉移方程,像這樣:

f[i][v]=max

這跟01揹包問題一樣有o(n*v)個狀態需要求解,但求解每個狀態的時間已經不是常數了,求解狀態f[i][v]的時間是o(v/c[i]),

總的複雜度是超過o(vn)的。

三,優化:

①若兩件物品i、j滿足c[i]<=c[j]且w[i]>=w[j],則將物品j去掉,不用考慮,類似於貪心思想,這個優化的正確性顯然:

任何情況下都可將價值小費用高得j換成物美價廉的i,得到至少不會更差的方案,這個優化可以簡單的o(n^2)地實現。

②可以考慮把完全揹包問題轉化為01揹包問題來解。最簡單的想法是,考慮到第i種物品最多選v/c[i]件,於是可以把

第i種物品轉化為v/c[i]件費用及價值均不變的物品,然後求解這個01揹包問題。這樣完全沒有改進基本思路的時間複雜度,

但這畢竟給了我們將完全揹包問題轉化為01揹包問題的思路:將一種物品拆成多件物品。

更高效的轉化方法是:把第i種物品拆成費用為c[i]*2^k、價值為w[i]*2^k的若干件物品,其中k滿足c[i]*2^k<=v。

這是二進位制的思想,因為不管最優策略選幾件第i種物品,總可以表示成若干個2^k件物品的和。這樣把每種物品

拆成o(log(v/c[i]))件物品,是乙個很大的改進。

③o(vn)的演算法:

for i=1..n

for v=0..v

f[v]=max;

這個偽**與p01

的偽**只有v的迴圈次序不同而已。為什麼這樣一改就可行呢?首先想想為什麼p01中要按照v=v..0的

逆序來迴圈。這是因為要保證第i次迴圈中的狀態f[i][v]是由狀態f[i-1][v-c[i]]遞推而來。換句話說,這正是為了保證每件物品

只選一次,保證在考慮「選入第i件物品」這件策略時,依據的是乙個絕無已經選入第i件物品的子結果f[i-1][v-c[i]]。

而現在完全揹包的特點恰是每種物品可選無限件,所以在考慮「加選一件第i種物品」這種策略時,卻正需要乙個可能已選入

第i種物品的子結果f[i][v-c[i]],所以就可以並且必須採用v=0..v的順序迴圈。

這個演算法也可以以另外的思路得出。例如,基本思路中的狀態轉移方程可以等價地變形成這種形式:

f[i][v] = max

四,封裝:

procedure completepack(cost, weight)

for v=cost..v

f[v]=max

揹包問題2(完全揹包)

問題的提出 有n種物品,乙個容量為v的揹包,每種物品可以無限的加入揹包,第i種物品的價值為v i 花費為w i 求將那些裝入揹包能讓價值最大且不超過揹包的容量?思路 該題類似於01揹包,唯一的不同就是所有的物品可以無限取,這樣從物品的角度考慮就會有多中方法,不像01中的取或不取 當然01揹包作為最基...

揹包問題(完全揹包)

1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...

揹包問題(0 1揹包 完全揹包)

0 1揹包 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。重要的點在於 每種物品僅有一件,可以選擇放 不放子問題 f i v 表示前i件物品恰好放入乙個 容量為v 的揹包可以獲得的最大價值。狀態轉移方程 遞推式 f i v max 考...