基於上次說的01揹包和完全揹包,揹包三連發還有最後乙個「多重揹包」,什麼事多重揹包,很簡單就是把01揹包和完全揹包結合起來的新揹包問題就叫做多重揹包。
有n種物品和乙個容量為v的揹包。第i種物品最多有n[i]件可用,每件費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。
這種揹包問題與完全揹包問題很類似,我們一樣可以用完全揹包的思想來解決問題,因為對於第i種物品有n[i]+1種策略:取0件,取1件……取n[i]件。令f[i][v]表示前i種物品恰放入乙個容量為v的揹包的最大權值,則有狀態轉移方程:
f[i][v]=max
如在01揹包問題中說到的,01揹包作為最基本的揹包問題,所以揹包問題都可以向01揹包方向轉化,所以就有把第 i 種物品換成n[i]件01揹包中的物品,則得到了物品數為σn[i]的01揹包問題,直接求解,複雜度仍然是o(v*σn[i])。
但是我們期望將它轉化為01揹包問題之後能夠像完全揹包一樣降低複雜度。仍然考慮二進位制的思想,我們考慮把第i種物品換成若干件物品,使得原問題中第i種物品可取的每種策略——取0..n[i]件——均能等價於取若干件代換以後的物品。另外,取超過n[i]件的策略必不能出現。
方法是:將第i種物品分成若干件物品,其中每件物品有乙個係數,這件物品的費用和價值均是原來的費用和價值乘以這個係數。使這些係數分別為1,2,4,...,2^(k-1),n[i]-2^k+1,且k是滿足n[i]-2^k+1>0的最大整數。例如,如果n[i]為13,就將這種物品分成係數分別為1,2,4,6的四件物品。
分成的這幾件物品的係數和為n[i],表明不可能取多於n[i]件的第i種物品。另外這種方法也能保證對於0..n[i]間的每乙個整數,均可以用若干個係數的和表示,這個證明可以分0..2^k-1和2^k..n[i]兩段來分別討論得出,並不難,希望你自己思考嘗試一下。
這樣就將第i種物品分成了o(log n[i])種物品,將原問題轉化為了複雜度為o(v*σlog n[i])的01揹包問題,是很大的改進。
下面給出o(log amount)時間處理一件多重揹包中物品的過程,其中amount表示物品的數量:
procedure multiplepack(cost,weight,amount)
if cost*amount>=v //當做選擇的物品大於揹包總量時就變化為完全揹包問題
completepack(cost,weight)
return
integer k=1
while k作為揹包問題還是在考動態規劃功力如何,所以掌握好動態規劃問題的解題思想對程式設計是很有利的!遇到揹包問題還需要細細分析,該題是屬於那種揹包,對於該種揹包問題你需要分析需要求的是什麼。
揹包問題 多重揹包
有n種物品和乙個容量為w的揹包。第i種物品最多有n i 件可用,每件重量是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。1.使用三重迴圈進行遞推 狀態轉移式為 dp i j max 關鍵 如下 void solve printf d n dp n ...
多維多重揹包問題 01揹包,完全揹包,多重揹包
csdn 專業it技術社群 登入 blog.csdn.net有n件物品和乙個容量為v的揹包。第i件物品的費用是w i 價值是v i 求將哪些物品裝入揹包可使價值總和最大。1.1空間優化 這要求在每次主迴圈中我們以 v v 0 的遞減順序計算 f v 這樣才能保證計算 f v 時 f v ci 儲存的...
多維多重揹包問題 多重揹包問題
悼念512汶川大 遇難同胞 珍惜現在,感恩生活 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙...