当前位置: 首页 > article >正文

部分背包问题

本节学习解决部分背包问题,部分背包代表物品可以按照一定比例被分割,而后放入背包内.这是十分经典的用贪心算法解决的问题.

问题描述:

给定一些物品,用matrix表示各个物品的属性,第一项表示物品的质量,第二项表示物品的总价值.现有一背包最大承重为M,试求如何让背包中所装物品价值最高

思路解析:

既然背包中的物品可以被分割,而背包容量有限,要想让背包中所装物品价值最大,是要尽可能先装入单位价值大的物品,变量定义如下:

matrix变量:表示给定的各个物品的重量和价值

max变量:表示给定的背包所能承受的最大重量

re变量:表示背包物品的价值之和

re_list变量:表示各个物品放入的百分比,若将某一物品全部放入,则为1

完整代码如下:

def bag(matrix, max):
    # 初始化总价值为0
    re = 0
    # 创建一个列表,用于记录每个物品是否被选中,初始化为0
    re_list = [0 for _ in range(len(matrix))]
    # 根据物品的价值重量比对matrix进行降序排序
    matrix.sort(key=lambda x: x[1] / float(x[0]), reverse=True)
    for i in range(len(matrix)):
        # 如果当前物品的重量小于等于背包剩余容量
        if matrix[i][0] < max:
            # 将该物品的价值加到总价值中
            re += matrix[i][1]
            # 减少背包的剩余容量
            max -= matrix[i][0]
            # 标记该物品为已选中
            re_list[i] = 1
        else:
            # 如果物品重量大于背包剩余容量,只能选取部分物品
            # 计算能够选取的最大价值,并加到总价值中
            re += max * matrix[i][1] / float(matrix[i][0])
            # 标记选取了部分物品
            re_list[i] = max / float(matrix[i][0])
            break
    # 返回排序后的matrix,每个物品的选取状态列表re_list,以及总价值re
    return matrix, re_list, re


http://www.kler.cn/a/456128.html

相关文章:

  • 在线学习平台-项目技术点-后台
  • Lottie动画源码解析
  • Jupyter在运行上出现错误:ModuleNotFoundError: No module named ‘wordcloud‘
  • opencl 封装简单api
  • 音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件
  • 高斯核函数(深入浅出)
  • 504 Gateway Time-out nginx如何处理
  • dell g7重装系统后无法识别耳机
  • springboot503基于Sringboot+Vue个人驾校预约管理系统(论文+源码)_kaic
  • Visual Studio 2022 QT5.14.2 环境下缺少pro文件以及QT库或模块的引用问题
  • 【蓝桥杯——物联网设计与开发】拓展模块5 - 光敏/热释电模块
  • LabVIEW生物发酵远程在线监控
  • ORB-SLAM2源码学习:System.cc: System::TrackStereo、TrackRGBD、TrackMonocular追踪器接口
  • 《中国旅游报》投稿指南
  • Java测试开发平台搭建(六)持久化之mybatis配置
  • 路由反射器
  • 强化学习寻宝游戏
  • C#使用Tesseract C++ API过程记录
  • 【Unity3D】Particle粒子特效或3D物体显示在UGUI上的方案
  • 【电子通识】拆解支付宝碰一碰卡片
  • 现代网络负载均衡与代理导论
  • Android着色器SweepGradient渐变圆环,Kotlin
  • 【C++ 真题】P5733 【深基6.例1】自动修正
  • 渗透测试面试问题
  • 【字符串】——python反转字符串的7种方法
  • this:[object Object](查看this对象)