python 使用动态规划解决01背包 支持浮点数据 使用

本文探讨了如何使用动态规划处理支持浮点数权重的01背包问题,常见方法不适用于浮点数据。引用了《算法分析与设计——C++语言描述》中的方法,并尝试用Python实现,但遇到问题。尽管能计算最大价值,却无法得到正确的解向量,特别是在物品数量较少的例子中。文章提供了错误示例进行说明。
摘要由CSDN通过智能技术生成

问题描述

具体内容来自于《算法分析与设计——C++语言描述》(第三版 陈慧南编著)。网上大多数只能搜到整型数据的背包问题,其转移方程中有需要根据索引【j-w[i]】来读取数组数据进行计算的,而如果重量数组w是浮点型,就没法使用那种转移方程了。

所以看了这本书的动态规划内容,其使用阶跃点来求解问题。我也根据书中给的算法使用python实现了一下,但是存有问题,希望能有人可以帮助我一下。

代码部分

1 常见的那种支持整型数据的

'''
说明:代码直接从我的文件中copy出来的
具体求解的问题,可以看做是一般分配问题
符号说明:
    N:物品数量
    M:背包数量
    bin_size: 存储多个背包尺寸的数组
    j: 当前遍历的次数,对应求解第几个背包的放置问题
    item_size: 物品尺寸的数组,是N*M的,每一列是一个背包中物品的尺寸,尺寸对每个背包可以是不同的
    P: 效益矩阵,每一列对应每个背包中物品的收益情况
'''
def lp_01knapsack(self, j):
    # 第j列,对应第j个背包的情况
    depth = j

    n, c = int(self.N), int(self.bin_size[depth])
    dp = [[0 for jindex in range(c + 1)] for index in range(n + 1)]
    for k in range(c + 1):
        dp[0][k] = 0

    # depth = j
    # 价值函数,需要提取profit矩阵的第j列  错了  是Pj
    value_
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值