python实现:验证0-1背包问题的动态规划算法

本文介绍了一种解决背包问题的动态规划算法,通过设计合适的数据结构存储子问题的最优解,实现快速查找并生成最终最优解。算法首先初始化状态矩阵,然后遍历所有物品,对于每个物品和背包容量,计算包含该物品的最大价值,并更新状态矩阵。最后,通过回溯状态矩阵,确定背包中所装的物品,输出最大价值及具体物品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求自己设计使用合适的数据结构,用于存储计算过程中各个子问题对应的最优子集,以方便最后进行回溯,生成最终问题的最优子集组成元素。

在这里插入图片描述

def bag(n, c, w, v):
    # 保存状态
    value = [[0 for j in range(c + 1)] for i in range(n + 1)]
    for i in range(1, n + 1):
        for j in range(1, c + 1):
            value[i][j] = value[i - 1][j]
            if j >= w[i - 1] and value[i][j] < value[i - 1][j - w[i - 1]] + v[i - 1]:
                value[i][j] = value[i - 1][j - w[i - 1]] + v[i - 1]
    return value
z
def show(n, c, w, value):
    print('最大价值为:', value[n][c])
    x = [False for i in range(n)]
    j = c
    for i in range(n, 0, -1):
        if value[i][j] > value[i - 1][j]:
            x[i - 1] = True
            j -= w[i - 1]
    print('背包中所装物品为:')
    for i in range(n):
        if x[i]:
            print('第', i+1, '个,', end='')

n = 4  #物品数量
c = 5  #容量
w = [2, 1, 3, 2]  #物品重量
v = [12, 10, 20, 15]  #物品价值
value = bag(n, c, w, v)
for _ in value:
    print(_)

show(n,c,w,value)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值