動態規劃 0-1 揹包問題 python
阿新 • • 發佈:2018-12-03
#有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和? #number=4,capacity=8 在程式中用n表示物品數量,用j表示剩餘容量 w = [0,2,3,4,5]#表示重量 v = [0,3,4,5,6]#表示價值 #列出模型遞推式 # 1)噹噹前剩餘容量小於物品重量時,即 j<w(i),此時不選擇該物品,價值不增加,和之前的價值一樣。V(i,j)=V(i-1,j) # 2)噹噹前剩餘容量大於物品重量時,即 j>=w(i),此時鰾膠加與不加之間的價值大小,取最大值 V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)} #先建表 n= 4 c= 8 import numpy as np x = np.zeros([n+1,c+1]) for i in range(1,n+1): for j in range(c,0,-1): if j<w[i]: x[i,j] = x[i-1,j] else: x[i,j] = max(x[i-1,j],x[i-1,j-w[i]]+v[i])#前i-1個物品的最優解與第i個物品的價值之和更大 print(x) #最大的結果為10 #最優解即是x(number,capacity)=x(4,8)=10 #下面如何回溯得到路徑 item = [0]*(n+1) def find_which_item(i,j,item): if i >=0: if x[i,j] == x[i-1,j]:#表示沒選這個 item = find_which_item(i-1,j,item) elif j-w[i]>=0 and x[i,j] == x[i-1,j-w[i]]+v[i]: item[i] = 1 item = find_which_item(i-1,j-w[i],item) return item #這裡的4 8 代表的是x(4,8)這裡的數字 item = find_which_item(4,8,item) print(item)