揹包問題 0 1揹包 完全揹包和多重揹包

2021-10-09 15:54:25 字數 1725 閱讀 4896

參考自:

以下**中的w是每個物品的重量,v是每個物品的價值

w =[0

]+list

(map

(int

,input()

.split())

)v =[0

]+list

(map

(int

,input()

.split())

)top =

int(

input()

)n =

len(w)

d =[[0

]*(top +1)

for _ in

range

(n +1)

]for i in

range(1

, n)

:for j in

range

(top +1)

:if w[i]

> j:

d[i]

[j]= d[i -1]

[j]else

: d[i]

[j]=

max(d[i -1]

[j], d[i -1]

[j - w[i]

]+ v[i]

)print

(d[n -1]

[top]

)

完全揹包和01揹包的區別在於每個物品的數量是無限多的,可以重複選取,因此只需要把上面的**中

d[i]

[j]=

max(d[i -1]

[j], d[i -1]

[j - w[i]

]+ v[i]

)

修改為

d[i]

[j]=

max(d[i -1]

[j], d[i]

[j - w[i]

]+ v[i]

)

這意味這第i件物品可以被重複選取

w =[0

]+list

(map

(int

,input()

.split())

)v =[0

]+list

(map

(int

,input()

.split())

)top =

int(

input()

)n =

len(w)

d =[[0

]*(top +1)

for _ in

range

(n +1)

]for i in

range(1

, n)

:for j in

range

(top +1)

:if w[i]

> j:

d[i]

[j]= d[i -1]

[j]else

: d[i]

[j]=

max(d[i -1]

[j], d[i]

[j - w[i]

]+ v[i]

)print

(d[n -1]

[top]

)

簡單地說,01揹包空間壓縮只需要把內迴圈改為從後向前遍歷即可;而完全揹包只需要從前向後遍歷。

揹包問題 01揹包 完全揹包 多重揹包

01揹包和完全揹包的區別 01揹包的侷限在於每樣物品只有一種,每個物品都有乙個屬於自己的價值和重量,在給定的物品中選出揹包所能容納的最大重量,要求是價值最大 完全揹包與01揹包的不同在於完全揹包不限制每樣物品的個數,物品的價值和質量都與01揹包一樣,也同樣是求在給定大小的容量中,找出最大價值的選擇 ...

揹包問題(01揹包,完全揹包,多重揹包)

揹包問題 01揹包,完全揹包,多重揹包 近日為以下瑣事煩身 差不多要向學院提交專案申請了,本來是想做個多模式的im系統的,可是跟往屆通過審核的專案比起來,缺乏創新和研究價值,所以在文件上要多做手腳,花點心思。揹包問題,經典有揹包九講。不死族的巫妖王發工資拉,死亡騎士拿到一張n元的鈔票 記住,只有一張...

揹包問題 01揹包,完全揹包,多重揹包

有goods num件物品,max volume的最大裝載量,每種物品只有一件,每種物品都有對應的重量或者說體積volume i 價值value i 求解裝包的最大價值 假設目前已經有 i 1件物品裝在容量為 j 的揹包中,並且得到最大價值package i 1 j 當前裝第i件,那麼討論分兩個角度...