C 揹包 稀奇古怪的多重揹包問題

2022-09-10 05:45:17 字數 2633 閱讀 3826

在這之前,我們講到了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種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙...