在這之前,我們講到了01揹包與完全揹包。這次,我們來講一講很搞笑又稀奇古怪的(我不認為)多重揹包問題。
例【n+2】這位流浪的探險者被困在了海島上。有一天,他發現了一艘船,於是,他就乘坐這艘船準備回家。這時,他在島上獲取了n種東西,每件物品有n件真古怪哈,價值c,費用w,他需要讓帶回去的東西有更大的價值,所以,程式設計幫助他,找出最佳搭配。
感覺大家已經能夠猜出這個悲催的人是誰了,就是大名鼎鼎的——魯濱孫大人!!!這個題目不用說了吧,很簡單,和完全揹包基本一樣。現在,我們只要把完全揹包的方程略微改動即可。這種揹包問題對於每種物品有n[i]+1(此處n為最多取物品的數量)種策略:取0個,1個,…n[i]個。令f[i][v]表示前i種物品恰放入容量為v的最大價值,則得出動態轉移方程:
f (i
)(v)
=max
(f(i
−1)(
v),f
(i−1
)(v−
k∗w(
i))+
k∗c(
i)∣0
<=k
<=n
(i))
f(i)(v)=max(f(i-1)(v),f(i-1)(v-k*w(i))+k*c(i)|0<=k<=n(i))
f(i)(v
)=ma
x(f(
i−1)
(v),
f(i−
1)(v
−k∗w
(i))
+k∗c
(i)∣
0<=k
<=n
(i))
此種演算法時間複雜度為o(v
∗∑n(
i)
)o(v*∑n(i))
o(v∗∑n
(i))
。結論得出的偽**如下:
for
(i=1.
..n)
for(v=v...0
)//此地根據01寫出,由於與完全不同,所以是v...0
for(k=0..
.n[i]
)
換一種好想好寫的分析方法,將多重揹包轉換為01揹包問題:把第i種物品換成n[i]件01揹包中的物品,則得到了物品數為(∑n
(i))
(∑n(i))
(∑n(i)
)的01揹包問題,直接求解,時間複雜度依然是(o(
v∗∑n
(i))
)(o(v*∑n(i)))
(o(v∗∑
n(i)
))。但是,我們要做乙個懶人 勤快之人,期望將他轉換成01揹包問題之後就像上次完全揹包問題一樣降低複雜度。仍然考慮二進位制的思想,把第i件物品換成若干件物品,使原問題中第i中物品可以取用的每種策略(取0~n[i]件物品)是與若干件物品代換後的相同。注意,取超過n[i]件物品的策略肯定不能出現。
於是,方法出現。將第i種物品換成n[i]件相同的物品,其中每件物品都有乙個係數,這件物品的費用和價值均是原來的費用與價值乘上這個係數,使這些係數分別為1,2,4,···,2k−
12^
2k−1
,n (i
)−2k
+1
n(i)-2^k+1
n(i)−2
k+1,且k是滿足n(i
)−2k
+1
>
0n(i)-2^k+1>0
n(i)−2
k+1>
0的最大整數(這裡請注意,分出的數是可以組合出n[i]內所有數字)。
是不是感覺蒙了!炸了!
好,我們來舉乙個例子就可以明白了。總結上面的方法,假設n[i]=13,就將這種物品分成係數分別為1,2,4,6的四件物品(分成了四件一樣但意義不同的物品,如果試試看,你就會發現,1,2,4,6可以組成13以內的任何數字。1,2,1+2,4,1+4,6,1+6,2+6,1+2+6,4+6,1+4+6,2+4+6,1+2+4+6=13)
對於上面有趣的式子,可以分0…2k−
12^
2k−1
和2
k2^k
2k…2n[i]討論得出,希望讀者自己思考思考,開動腦筋。
分成的這些物品係數的和為n[i],表示不可能取多於n[i]的第i件物品。這樣就將第i件物品分為了log
∗n(i
)log*n(i)
log∗n(
i)種物品,將原問題的複雜度轉化為o(v
∗∑lo
gn(i
))
o(v*∑logn(i))
o(v∗∑l
ogn(
i))這是很大的改進呀!
分析結束,此處貼出慢版的程式:
#include
#include
#include
using
namespace std;
int v[
10000
],w[
10000
],s[
10000
],f[
10000
],n,m,i,j,k;
int main (
) cout<;}
揹包問題 多重揹包
有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種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙...