如果將三種揹包問題混合起來。也就是說,有的物品只可以取一次(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種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙...