1. 程式人生 > 程式設計 >淺析python實現動態規劃揹包問題

淺析python實現動態規劃揹包問題

一個包可以背4kg的東西,現在有四件東西,重量分別為1kg,4kg,3kg,1kg,價值為:1500,3000,2000,2000;

現在要求你,在包裡背的東西價值最大,但是不能超過揹包的最大載重量

#幾件物品的重量
w = [0,1,4,3,1]
#幾件物品的價值
v= [0,1500,2000]
#物品數量
n = len(w) - 1
#包的載重量
m = 4
 
#建立一個列表表示在包中的物品,元素是True時代表對應元素放入
x = [] 
#放入包中的總價值
value = 0
#建立一個矩陣,來表示在前i個物品中,當載重量是j時,放入包中的最大價值,table[i][j]
table = [[0 for i in range(m+1)] for j in range(n+1)]
 
def dynamic(w,v,n,m,x):
 #計算table矩陣
 for i in range(1,n+1): #代表物品一件一件的考慮
  for j in range(1,m+1):  #代表子揹包的大小一點一點的考慮
   if (j >= w[i]): #當揹包的大小大於物品的重量時,考慮放進去
    table[i][j] = max(table[i-1][j],table[i-1][j-w[i]] + v[i])
   else:
    table[i][j] = table[i -1][j] #如果放不進去,就繼承之前的價值
    
 #遞推裝入揹包中的物體,尋找跳變的地方,從最後結果開始逆推
 j = m
 for i in range(n,-1):
  if table[i][j] > table[i- 1][j]: #如果多加一件物品之後,價值增大,就將這一件物品加入列表中
   x.append(i)
   j = j - w[i] #此時為剩餘揹包的載重量
   
 #返回最大價值,即表格中最後一行最後一列的值
 value = table[n][m]
 return value
 
print("最大價值為:",str(dynamic(w,x)))
print("物品的索引:",x)

PS:python動態規劃之揹包問題

import numpy as np
def bag(weight,values,weight_cont):
 num = len(weight)
 weight.insert(0,0)
 values.insert(0,0)
 bag = np.zeros((num+1,weight_cont+1),dtype=np.int)
 for i in range(1,num+1):
  for j in range(1,weight_cont+1):
   if j >= weight[i]:
    bag[i][j] = max(bag[i-1][j],bag[i-1][j-weight[i]]+values[i])
   else:
    bag[i][j] = bag[i][j-1]
 return bag[-1][-1]
if __name__ == '__main__':
 weight = [1,2,10,12]
 values = [1200,1300,2500]
 weight_cont = 20
 re = bag(weight,weight_cont)
 print(re)

到此這篇關於python實現動態規劃揹包問題的文章就介紹到這了,更多相關python動態規劃揹包內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!