【动态规划】背包问题

算法图解案例

image.png


image.png

代码求解

import numpy as np

commodities = np.array([[1500, 3000, 2000], [1, 4, 3]])  # 商品列表,第一行表示商品的价格,第二行表示商品的重量
arr = np.zeros((commodities.shape[1], 4), dtype=int)  # 动态规划表格

max_val = 0  # 能够偷取的商品的最大价值

# 先填充表格的第一行(即偷取第一个商品)
for j in range(0, arr.shape[1]):
    arr[0][j] = commodities[0][0] if commodities[1][0] <= j + 1 else 0

# 依次偷取剩余商品然后比较价格
for i in range(1, arr.shape[0]):
    for j in range(0, arr.shape[1]):
        if commodities[1][i] <= j + 1:
            left_space = j + 1 - commodities[1][i]
            before_val = arr[i - 1][j]
            current_val = commodities[0][i] if left_space == 0 else commodities[0][i] + arr[i - 1][left_space - 1]
            arr[i][j] = current_val if current_val > before_val else before_val
        else:
            arr[i][j] = arr[i - 1][j]

max_val = arr.flatten()[-1]  # 表格最后一个值为最后能够偷取的最大价值
print(arr)
print(max_val)

及时获取我发的文章,学习更多编程知识欢迎关注我的个人微信公众号:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值