1. 程式人生 > >動態規劃 0-1 揹包問題 python

動態規劃 0-1 揹包問題 python

#有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)