动态规划一次性背包问题(python)
作者:互联网
def one_bag(weight, value, max_weight):
pre_max_value = [0] * (max_weight + 1)
count = 0
# 对物品的价值进行循环
for v_inx, v_val in enumerate(value):
max_value = [0] * (max_weight + 1)
# 物品重量
val_weight = weight[v_inx]
# 对背包的承重量进行循环
for w_inx in list(range(max_weight + 1)):
# 如果当前背包的承重量大于等于物品的重量时
if w_inx >= val_weight:
"""
v_val:当前物品的价值
w_inx:背包当前能承受的最大重量
val_weight:当前物品的重量
w_inx - val_weight:装载了当前物品后,当前背包还能装载物品的重量
pre_max_value[max_weight - val_weight]:背包装下当前物品之后,还能装载物品的最大价值
pre_max_value[w_inx]:上一次计算当前重量所能装载的最大价值
"""
max_value[w_inx] = max(v_val + pre_max_value[w_inx - val_weight], pre_max_value[w_inx])
else:
"""
如果背包的承重量小于当前物品的价值,则为上一次计算的所能承载物品的最大价值
"""
max_value[w_inx] = pre_max_value[w_inx]
count += 1
print("包含前 %d 个物品时,各个重量的背包所能装载的最大价值: " % (count))
pre_max_value = max_value
print(pre_max_value)
return pre_max_value
# 每个物品的重量
weight = [2, 4, 3, 4]
# 对应的每个物品的价值
value = [1500, 3000, 2000, 3500]
# 背包能承受的最大重量
max_weight = 10
print(one_bag(weight=weight, value=value, max_weight=max_weight))
"""
包含前 1 个物品时,各个重量的背包所能装载的最大价值:
[0, 0, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500]
包含前 2 个物品时,各个重量的背包所能装载的最大价值:
[0, 0, 1500, 1500, 3000, 3000, 4500, 4500, 4500, 4500, 4500]
包含前 3 个物品时,各个重量的背包所能装载的最大价值:
[0, 0, 1500, 2000, 3000, 3500, 4500, 5000, 5000, 6500, 6500]
包含前 4 个物品时,各个重量的背包所能装载的最大价值:
[0, 0, 1500, 2000, 3500, 3500, 5000, 5500, 6500, 7000, 8000]
[0, 0, 1500, 2000, 3500, 3500, 5000, 5500, 6500, 7000, 8000]
"""
标签:背包,inx,weight,一次性,python,max,value,1500,物品 来源: https://blog.csdn.net/qq_40722604/article/details/112003503