多重揹包問題 python實現 ,動態規劃

2021-10-03 03:10:08 字數 2187 閱讀 3068

感謝這些朋友們的文章,給了我很大啟發:

多重揹包和01揹包以及完全揹包問題的區別在於:每個物品的數量是給定的,既不是01揹包中的1個,也不是完全揹包中的無窮多個。

其實這個和完全揹包那個三重迴圈的解法很像,如果那個能理解,這個也不在話下了。

先上**:

import numpy as np

def solution(max_weight,weight,value,num):

dp = np.zeros((len(weight)+1,max_weight+1),dtype=int)

for i in range(1,len(weight)+1):

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

if weight[i-1] > j:

dp[i][j] = dp[i-1][j]

else:

count = min(num[i-1],j//weight[i-1])

dp[i][j] = dp[i-1][j]

for k in range(1,count+1):

temp = dp[i-1][j-k * weight[i-1]] + k * value[i-1]

if temp > dp[i][j]:

dp[i][j] = temp

print(dp)

return dp

資料:weight = [1,2,2]

value = [6,10,20]

num = [10,5,2]

揹包容量:8

分析程式:還是先建立乙個二維陣列dp,由於是多重揹包,所以對於乙個物品i(假設i=3,是3號物品),有如下選擇:

所以在**中,如果j大於當前物品單個的重量,就要算出最多能拿多少個

count = min(num[i-1],j//weight[i-1])
用min是因為如果揹包容量太大,能裝下物品地數量就大於給定數量了,因此用num[i-1]來做上界。

緊接著 dp[i][j] = dp[i-1][j] ,是考慮到了不選當前物品比選更優的情況。接著

for k in range(1,count+1):

temp = dp[i-1][j-k * weight[i-1]] + k * value[i-1]

if temp > dp[i][j]:

dp[i][j] = temp

對能拿的物品數量遍歷,迴圈結束後會解出最優方案(是不拿,還是拿1個、2個…)

下面的**能將選了什麼物品輸出:

def things(max_weight,dp,weight,value,num):

raw = len(weight)

col = max_weight

remain = dp[raw][col]

goods = [0,0,0]

while remain != 0:

if remain != dp[raw-1][col]:

count = min(num[raw-1],col//weight[raw-1])

for k in range(1,count+1):

if dp[raw][col] - k * value[raw-1] == dp[raw-1][col-k * weight[raw-1]]:

remain -= k * value[raw-1]

col -= k * weight[raw-1]

goods[raw-1] = k

raw -= 1

print(goods)

分析程式:if remain != dp[raw-1][col]這句,是看看拿沒拿當前物品,如果左右相等說明沒拿。如果不等,再往下看:

count = min(num[raw-1],col//weight[raw-1]) 是把能裝多少個物品求出來。

if dp[raw][col] - k * value[raw-1] == dp[raw-1][col-k * weight[raw-1]] 這行的意思是,現在的揹包狀態拿出k個當前物品,剩餘的價值 是否等於 前面的物品和除去這k個物品所佔的重量的價值。若相等,說明就是拿了k個當前物品。

輸出:

[4, 0, 2]
第乙個物品拿4個,第三個物品拿2個。

python多重揹包 多重揹包

多重揹包問題 有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。資料範圍 0 n v 100 0 vi wi si 100 樸素版多重揹包問題 樸素版完全揹包問...

多維多重揹包問題 多重揹包問題

悼念512汶川大 遇難同胞 珍惜現在,感恩生活 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙...

揹包問題 多重揹包

有n種物品和乙個容量為w的揹包。第i種物品最多有n i 件可用,每件重量是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。1.使用三重迴圈進行遞推 狀態轉移式為 dp i j max 關鍵 如下 void solve printf d n dp n ...