0_1_2揹包問題動態規劃方法求解python代碼
0_1揹包遞推公式
0_1_2揹包問題則爲,可對一件物品放1個或者2個,0爲不放。設計算法時比0_1揹包問題多加一個限制條件
def ZeroOneTwoBag(n, W, V, C):
C = int(C) # 容量C
n = int(n) # 物品個數
w = W.split(',')
w = [int(i) for i in w] # 物品重量數組
v = V.split(',')
v = [int(i) for i in v] # 物品價值數組
bagTable = [[0 for j in range(C + 1)] for i in range(n + 1)]
for key_n in range(1,len(bagTable)):
for key_c in range(1,len(bagTable[key_n])):
#當前商品重量大於當前揹包重量
if w[key_n-1] > key_c:
bagTable[key_n][key_c] = bagTable[key_n-1][key_c]
#如果當前揹包容量小於兩倍物品重量大於一倍物品重量
elif w[key_n-1] <= key_c < 2*w[key_n-1]:
# 如果放揹包裏,等於只放key_n-1個物品時,並且揹包容量爲key_c-W[key_n]時的價值加上當前的物品價值
value1 = bagTable[key_n - 1][key_c - w[key_n - 1]] + v[key_n - 1]
# 如果不放在揹包裏
value2 = bagTable[key_n - 1][key_c]
bagTable[key_n][key_c] = max(value1, value2)
else:
# 如果放揹包裏,等於只放key_n-1個物品時,並且揹包容量爲key_c-W[key_n]時的價值加上當前的物品價值
value1 = bagTable[key_n - 1][key_c - w[key_n - 1]] + v[key_n - 1]
# 如果不放在揹包裏
value2 = bagTable[key_n - 1][key_c]
#如果放兩個在揹包裏
value3 = bagTable[key_n - 1][key_c - 2*w[key_n - 1]] + 2*v[key_n - 1]
bagTable[key_n][key_c] = max(value1, value2,value3)
for i in range(len(bagTable)):
print(bagTable[i])
return bagTable
if __name__ == '__main__':
inputlist = str(input()).split('-')
n = inputlist[0]
W = inputlist[1]
V = inputlist[2]
C = inputlist[3]
ZeroOneTwoBag(n, W, V, C)