混合揹包問題,和多重揹包問題一樣的處理

2021-09-01 05:00:32 字數 2528 閱讀 3043

如果將三種揹包問題混合起來。也就是說,有的物品只可以取一次(01揹包),有的物品可以取無限次(完全揹包),有的物品可以取的次數有乙個上限(多重揹包)。應該怎麼求解呢?

def

change_multiple_to_01

(n,v,c,w,m)

: c_ =

w_ =

for i in

range

(n):

t =min(v // c[i]

,m[i]

) k =

1 j = t

while

2*k <= t:))

j -= k

k *=2)

)def

pack_0_1_first

(n,v,c,w)

:

f =[0

]*(v+1

)for i in

range(1

,n+1):

for v in

range

(v,c[i-1]

-1,-

1): f[v]

=max

(f[v]

,f[v-c[i-1]

]+ w[i-1]

)return f[v]

n_ =

len(c_)

return pack_0_1_first(n_,v,c_,w_)

def

pack_01_and_complete_and_multiple_bottom_up

(n,v,c,w,m)

:list

= np.zeros(

(n+1

,v+1

),dtype=

int)

for i in

range(1

,n+1):

for j in

range(0

,v+1):

t =min(j // c[i-1]

,m[i-1]

) result =

-1000

for k in

range

(t+1):

a =list

[i-1

,j-k*c[i-1]

]+ k*w[i-1]

if a > result:

result = a

list

[i,j]

= result

return

list

[n,v]

def

pack_01_and_complete_bottom_up

(n,v,c,w,m)

:list=[

0]*(v+1)

for i in

range(1

,n+1):

if m[i-1]

==1:for v in

range

(v,c[i-1]

-1,-

1):list

[v]=

max(

list

[v],

list

[v-c[i-1]

]+ w[i-1]

)if m[i-1]

==1000

:for v in

range

(c[i-1]

,v+1):

list

[v]=

max(

list

[v],

list

[v-c[i-1]

]+ w[i-1]

)return

list

[v]

#%%

n =7

v =100

c =[11,

2,3,

9,13,

6,7,

5]w =[1,

2,9,

7,5,

11,6,

14]m =[

1000,1

,1000,1

,1000,1

,1,1

]print pack_multiple_bottom_up(n,v,c,w,m)

print change_multiple_to_01(n,v,c,w,m)

print pack_01_and_complete_bottom_up(n,v,c,w,m)

print pack_01_and_complete_and_multiple_bottom_up(n,v,c,w,m)

print change_multiple_to_01_yes_or_no(n,v,c,m)

print pack_multiple_yes_or_no(n,v,c,m)

297297

297297

true

1

0 1 完全揹包 多重揹包問題 混合揹包

0 1揹包問題 dp i j 表示前i件物品,體積容量為j的揹包所能獲得的最大價值 決策是第i個物品選不選 轉移方程 dp i j max dp i 1 j dp i 1 j v i w i n為物品數量,m為揹包體積 for int i 1 i n i for int j 0 j m j if j...

揹包問題 多重揹包

有n種物品和乙個容量為w的揹包。第i種物品最多有n i 件可用,每件重量是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。1.使用三重迴圈進行遞推 狀態轉移式為 dp i j max 關鍵 如下 void solve printf d n dp n ...

多維多重揹包問題 多重揹包問題

悼念512汶川大 遇難同胞 珍惜現在,感恩生活 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙...