有n
種物品和乙個容量為v
的揹包,每種物品都有m
im_i
mi件可用,放入第i
件物品的費用是c
ic_i
ci,得到的價值是w
iw_i
wi。求解將哪些物品裝入揹包可使價值綜合最大。
如果看過之前的完全揹包問題,這裡的多重揹包問題應該就能秒殺了,當時考慮過將完全揹包轉化為01揹包問題求解,而多重揹包其實就是加了限制的完全揹包,當然也能轉化為01揹包問題。
方法是:將第 i 種物品分成若干件01揹包中的物品,其中每件物品有乙個係數。這件物品的費用和價值均是原來的費用乘以這個係數。令這些係數分別為1,2
,22,
...,
2k−1
,mi−
2k+1
1, 2, 2^2, ..., 2^, m_i - 2^k+1
1,2,22
,...
,2k−
1,mi
−2k
+1,其中 k 是滿足mi−
2k+1
>
0m_i - 2^k + 1>0
mi−2k
+1>
0的最大整數(其實就是保證係數和等於m
im_i
mi)。舉個栗子,m
im_i
mi為13,則相應的k=3
k = 3
k=3,所有係數為1,2,4,6。
懶得寫了~還得自己造資料,和01揹包問題**類似的
做幾道題吧~
洛谷p1776 寶物篩選
題目描述:
終於,破解了千年的難題。小 ff 找到了王室的寶物室,裡面堆滿了無數價值連城的寶物。
這下小 ff 可發財了,嘎嘎。但是這裡的寶物實在是太多了,小 ff 的採集車似乎裝不下那麼多寶物。看來小 ff 只能含淚捨棄其中的一部分寶物了。
小 ff 對洞穴裡的寶物進行了整理,他發現每樣寶物都有一件或者多件。他粗略估算了下每樣寶物的價值,之後開始了寶物篩選工作:小 ff 有乙個最大載重為 w 的採集車,洞穴裡總共有 n 種寶物,每種寶物的價值為 v
iv_i
vi,重量為 w
iw_i
wi,每種寶物有 m
im_i
mi件。小 ff 希望在採集車不超載的前提下,選擇一些寶物裝進採集車,使得它們的價值和最大。
輸入輸出格式以及樣例跳過,請參考原題~
其實非常簡單,就是多重揹包吧,和上面的思路一樣,就是在01揹包問題的基礎上加了一層迴圈,直接上**(附有注釋!)
#include
#include
#include
using
namespace std;
intmain()
for(
int i =
0; i < n; i++)}
k = m[i]
- k +1;
// 最後乙個係數,保證係數和為m[i]
for(
int j = wsum; j >= k * w[i]
; j--)}
cout << dp[wsum]
<< endl;
free
(v);
free
(w);
free
(dp)
;return0;
}
揹包九講之三(多重揹包)
證明如下 係數可取值 1,2,4,2 k 1 n i 2 k 1,k是使得n i 2 k 1 0的最大整數 前n項和為2 k 1,那麼最後一項為 n i 2 k 1 這些係數之和為n i 且0 n i 間的每乙個整數均可以用若干個係數的和表示 證明如下 先證明區間0.2 k 1,我們有係數1,2,4...
動態規劃之揹包九講之三 多重揹包
題目 有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數...
揹包九講之多重揹包
揹包九講原文 有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。這題目和完全揹包問題很類似。基本的方程只需將完全揹包問題的方程略微一改即可,因為對於第i種物品有n i 1種策略 ...