python 0 1揹包問題(動態規劃)

2021-09-25 02:19:04 字數 2625 閱讀 1285

0/1揹包問題:給定n種物品和乙個容量為c的揹包,物品的重量依次是 2, 2, 3, 1, 5, 2,其價值依次是2, 3, 1, 5, 4, 3,揹包問題是如何使選擇裝入揹包內的物品,使得裝入揹包中的物品的總價值最大。其中,每種物品只有全部裝入揹包或不裝入揹包兩種選擇。

演算法

#   n   物品數量 int 

# c 書包能承受的重量 int

# w 每個物品的重量 list

# v 每個物品的價值 list

def bag(n, c, w, v):

value = [[0 for j in range(c + 1)] for i in range(n + 1)]

for i in range(1, n + 1):

for j in range(1, c + 1):

if j < w[i - 1]:

value[i][j] = value[i - 1][j]

else:

value[i][j] = max(value[i - 1][j], value[i - 1][j - w[i - 1]] + v[i - 1])

# 揹包總容量夠放當前物體,取最大價值

for x in value:

print(x)

return value

if __name__=='__main__':

n=6c=10

w = [2, 2, 3, 1, 5, 2]

v = [2, 3, 1, 5, 4, 3]

bag(n,c,w,v)

# 輸出

'''[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2]

[0, 0, 3, 3, 5, 5, 5, 5, 5, 5, 5]

[0, 0, 3, 3, 5, 5, 5, 6, 6, 6, 6]

[0, 5, 5, 8, 8, 10, 10, 10, 11, 11, 11]

[0, 5, 5, 8, 8, 10, 10, 10, 12, 12, 14]

[0, 5, 5, 8, 8, 11, 11, 13, 13, 13, 15]

'''

從尾遍歷value列表,當value大於上一行同樣位置的value時,表示放進該物品

def show(n, c, w, value):

print('最大價值為:', value[n][c])

x = [0 for i in range(n)]

j = c

for i in range(n, 0, -1):

if value[i][j] > value[i - 1][j]:

x[i - 1] = 1

j -= w[i - 1]

print('揹包中所裝物品為:')

for i in range(n):

if x[i]:

print('第', i+1, '個,', end='')

完整**

時間與空間複雜度均為(nc)

def bag(n, c, w, v):

value = [[0 for j in range(c + 1)] for i in range(n + 1)]

for i in range(1, n + 1):

for j in range(1, c + 1):

if j < w[i - 1]:

value[i][j] = value[i - 1][j]

else:

value[i][j] = max(value[i - 1][j], value[i - 1][j - w[i - 1]] + v[i - 1])

# 揹包總容量夠放當前物體,取最大價值

return value

def show(n, c, w, value):

print('最大價值為:', value[n][c])

x = [0 for i in range(n)]

j = c

for i in range(n, 0, -1):

if value[i][j] > value[i - 1][j]:

x[i - 1] = 1

j -= w[i - 1]

print('揹包中所裝物品為:')

for i in range(n):

if x[i]:

print('第', i+1, '個,', end='')

if __name__=='__main__':

n=6c=10

w = [2, 2, 3, 1, 5, 2]

v = [2, 3, 1, 5, 4, 3]

value = bag(n,c,w,v)

show(n, c, w, value)

# 輸出

'''最大價值為: 15

揹包中所裝物品為:

第 2 個,第 4 個,第 5 個,第 6 個,

'''

參考鏈結

Python 0 1揹包 動態規劃

0 1揹包問題 在能承受一定重量的揹包中,放入重量不同,價值不同的幾件物品,怎樣放能讓揹包中物品的價值最大?比如,有三件物品重量w,價值v分別是 w 5,3,2 v 9,7,8 包的容量是5,也就是我們要求得 maxval v1 v2 v3 約束條件為 ws w1 w2 w3 我們的思路是,列舉出所...

0 1揹包問題python 0 1揹包問題1

鼓搗好久 終於了然了一些 0 1揹包問題描述 有乙個竊賊在偷竊一家商店時發現有n件物品,第i件物品價值為vi元,重量為wi,假設vi和wi都為整數。他希望帶走的東西越值錢越好,但他的揹包中之多只能裝下w磅的東西,w為一整數。他應該帶走哪幾樣東西?注 0 1揹包問題中 每件物品或被帶走,或被留下,需要...

動態規劃 0 1 揹包問題 python

有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?number 4,capacity 8 在程式中用n表示物品數量,用j表示剩餘容量 w 0,2,3,4,5 表示重量 v 0,3,4,5,6 表示價值 列出模型遞推式 1 當當前剩餘容量小於物品重量時...