揹包九講 三 多重揹包問題

2021-10-24 20:30:14 字數 1732 閱讀 8551

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種策略 ...