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 當當前剩餘容量小於物品重量時...