编程语言
首页 > 编程语言> > 动态规划一次性背包问题(python)

动态规划一次性背包问题(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