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)