部分背包问题【贪心算法】

news2024/10/7 10:15:32

部分背包问题是一种经典的贪心问题,物品可以取一部分,也就是可以随意拆分的物品。

算法思路:

  1. 用列表保存每个物品的价值及总重量、平均价值(性价比)。
  2. 输入数据同时计算每种物品的平均价值。
  3. 使用自定义的compare函数以及自带的sort函数将结构体进行排序。
  4. 循环遍历从最大平均价值开始放入背包,能放肯定是全部放,不能放就放背包剩余重量。
  5. 最后控制格式输出即可。

算法核心思想:让背包单位空间价值达到最高

注释较为详细,此处不再赘述。

from myRandom import randomint_LCG


def KnaspackGreedy(weights, values, capacity):
    vw_ratios = []  # 各商品性价比
    max_value = 0  # 该背包容量下的最大价值
    # 计算性价比
    for i in range(len(weights)):
        vw_ratio = {}  # 字典(记录比率和原索引)用于后续排序
        vw_ratio['ratio'] = round(values[i] / weights[i], 2)  # 计算性价比(价值/重量)
        vw_ratio['index'] = i  # 设置索引
        vw_ratios.append(vw_ratio)  # 将计算该商品的性价比、原索引字典添加到列表中
    print("性价比:{}".format(vw_ratios))  # 打印计算好的各商品性价比、原索引
    vw_ratios.sort(key=compare, reverse=True)  # 将性价比数组排序,排序依据列表每项字典中的“ratio”值
    print("性价比(排序):{}".format(vw_ratios))  # 打印排序好的性价比列表
    best_select = []  # 最佳选择的商品序列(取了全部还是部分)
    # 开始装填背包(从高性价比商品开始遍历)
    for vw_ratio in vw_ratios:
        # 如果该商品重量小于当前背包剩余容量
        if weights[vw_ratio['index']] < capacity:
            good = {}
            # 减小背包容量
            capacity -= weights[vw_ratio['index']]
            # 更新当前背包最大价值
            max_value += values[vw_ratio['index']]
            #  将该物品添加到最佳选择队列中
            good['index'] = vw_ratio['index']
            good['weights'] = weights[vw_ratio['index']]
            best_select.append(good)
        else:  # 否则背包不能装下该商品全部
            good = {}
            # 将背包剩余容量全部装该商品
            good['weights'] = capacity
            good['index'] = vw_ratio['index']
            max_value += capacity * vw_ratio['ratio']
            # 背包剩余容量清零
            capacity = 0
            #  将该物品添加到最佳选择队列中
            good['index'] = vw_ratio['index']
            max_value += capacity * vw_ratio['ratio']
            best_select.append(good)
        # 如果背包剩余容量清零则终止遍历
        if capacity == 0:
            break

    print("最佳商品选择:{}".format(best_select))
    print("背包最大价值:{}".format(max_value))
    return best_select


# 自定义排序比较方案
def compare(onedict):
    return onedict['ratio']


if __name__ == '__main__':
    num = 2  # 商品数量
    # 随机生成商品价值和重量
    values = randomint_LCG(num, 0, 50)
    print("价值:{}".format(values))
    weights = randomint_LCG(num, 1, 20)
    print("重量:{}".format(weights))
    # 背包最大容量(问题规模)
    capacity = 10
    print("背包容量:{}".format(capacity))
    KnaspackGreedy(weights, values, capacity)

 随机数生成函数(也可以使用自带的random模块改写,笔者此处是从实现随机数底层写)

import time


# 随机数生成器
def randomint_LCG(length, start, end):
    """线性同余生成器。
    seed -- 随机数的种子
    a -- 线性同余生成器的常数
    c -- 线性同余生成器的常数
    x_0 -- 其实计算点
    length -- 要生成的随机数的数量
    start -- 随机数范围开始的值
    end -- 随机数范围结束的值
    """
    a = int(time.time()) % 54321
    c = int(time.time()) % 12345
    x_0 = int(time.time()) % 78945
    random_numbers = []
    random_numbers.append((a * x_0 + c) % (end - start) + start)  # 初始化第一个随机数
    for i in range(1, length):
        random_numbers.append((random_numbers[i - 1] + c) % (end - start) + start)  # 计算后续随机数
    return random_numbers

运行测试:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1206232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PADS快速调整器件的位号

选择元器件&#xff0c; ctrlA 全选器件&#xff0c;右击菜单选择特性 如下三个信息&#xff0c;确认 配置标签信息&#xff0c;如图界面信息&#xff0c;点击应用&#xff0c;器件全部归位

Slax Linux 强化了会话管理和引导参数选项

导读Slax Linux 的创始人和维护者Tomas Matejicek 宣布 了他的微型和便携 GNU/Linux 发行版的新版本&#xff0c;带来了各种增强和错误修复。 新的 Slax Linux 版本&#xff08;基于 Debian 的 12.1 版本和基于 Slackware 的 15.0.2 版本&#xff09;引入了在可写设备上运行发…

vue3 ref 与shallowRef reactive与shallowReactive

ref 给数据添加响应式&#xff0c;基本类型采用object.defineProperty进行数据劫持&#xff0c;对象类型是借助reactive 实现响应式&#xff0c;采用proxy 实现数据劫持&#xff0c;利用reflect进行源数据的操作 let country ref({count:20,names:[河南,山东,陕西],objs:{key…

AI大模型时代,开发工程师与项目管理者面对的机遇和挑战,文末送书3本

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

centos7 在线安装python3

在线安装命令 yum install -y python3 输入命令之后等待安装完成 查看版本 查看版本3 输入命令 python3 看到版本号为3.6.8 查看版本2 输入命令 python2 看到版本号为2.7.5

网络运维Day13

文章目录 部署web服务器部署虚拟机web1安装依赖包解压NGINX压缩包初始化编译编译安装查看验证配置动静分离 部署虚拟机web2安装依赖包解压NGINX压缩包初始化编译编译安装查看验证配置动静分离 配置NGINX七层代理测试健康检查功能 配置NGINX四层代理部署代理服务器 总结 部署web…

vue中cli组件如何自定义定义

目录 创建自定义组件 注册并使用自定义组件 注册组件&#xff1a; 在需要使用该组件的页面或父组件中注册并引入自定义组件。 使用 Props 传递数据 总结步骤&#xff1a; 前言 在Vue CLI中使用自定义组件是构建交互式和模块化Web应用的重要一环。Vue CLI为开发者提供了使用…

RocketMQ底层通信机制

分布式系统各个角色间的通信效率很关键&#xff0c;通信效率的高低直接影响系统性能&#xff0c;基于Socket实现一个高效的TCP通信协议是很有挑战的&#xff0c;本节介绍RocketMQ是如何解决这个问题的。 1.Remoting模块 RocketMQ的通信相关代码在Remoting模块里&#xff0c;先…

Linkage Mapper 报错

1 . 错误提示&#xff1a;“No module named lm_config” 错误原因&#xff1a;**** 2.错误提示&#xff1a;“Cannot find an installation of Circuitscape in your Program Files directory.” 错误原因&#xff1a;***** 3. 错误提示&#xff1a;UnicodeEncodeError: ‘asc…

Windows 微PE WePE_64_V2.3 PE模式下启用账号和修改密码

启动PE后&#xff0c;进入桌面打开运行dism程序 选择带有系统的盘符&#xff08;默认选的是PE盘&#xff09;&#xff0c;然后打开会话 选择左侧工具箱&#xff0c;然后右侧找到账户管理 然后就可以对已有账号进行管理了 结束。

Java SE 封装、包、static关键字和代码块

1.封装 1.1封装的概念 面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主要研究的就是封装特性。何为封装呢&#xff1f;简单来说 就是套壳屏蔽细节。 封装&#xff1a;将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细…

springboot-error

Invalid bound statement (not found): com.example.demo.mapper.UserMapper.findAll 一直报错&#xff0c;找不到相应的mapper文件。 排除以下原因之后&#xff0c;还是不对&#xff1a; https://blog.csdn.net/xxpxxpoo8/article/details/127548543 最后发现是因为我的mapp…

云原生实战课大纲

1. 云原生是什么 原生应用&#xff08;java,pyrhon&#xff09; 上云的过程应用上云遇到的问题1.微服务的拆分 微服务的访问关系应用的架构云原生适合什么样的人去学具备什么样的前提条件云原生要学习什么docker k8s devlops server mesh jks k8s监控吧自己的微服务上云另…

聊聊leetcode可包含重复数字的序列的《47. 全排列 II》中的vis标记函数

1 题目描述&#xff08;字节二面题目&#xff09; 2 代码 class Solution {List<List<Integer>>res;List<Integer>list;boolean[]used;public List<List<Integer>> permuteUnique(int[] nums) {resnew ArrayList<>();listnew ArrayList&l…

PHP中$_SERVER全局变量

在PHP中&#xff0c;$_SERVER 是一个全局数组变量&#xff0c;它包含了有关服务器和当前脚本的信息。$_SERVER 数组中的每个元素都是服务器环境的一个参数&#xff0c;如请求的方法、请求的 URI、客户端 IP 地址等。 PATH 系统环境变量的值&#xff0c;包含了多个目录的路径…

SaaS 电商设计 (三) 如何做大促压测

一.背景&目标 1.1 常见的压测场景 电商大促:一众各大厂的促销活动场景,如:淘宝率先推出的天猫双11,而后京东拉出的京东 618 .还是后续陆陆续续的一些年货节, 3.8 女神节等等.都属于一些常规的电商大促 票务抢购:常见的如承载咱们 80,90 青春回忆的 Jay 的演唱会,还有普罗…

Docker - 容器数据卷

Docker - 容器数据卷 什么是容器数据卷 等同于挂载&#xff0c;将容器内的目录地址指向于宿主机文件系统中 直接使用命令来挂载 -v docker run -it -v 主机目录:容器内目录# 测试 docker run -it -v /root:/home centos /bin/bash [rootiZ2zeg7mctvft5renx1qvbZ ~]# docker …

求最大公约数math.gcd()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 求最大公约数 math.gcd() [太阳]选择题 下列代码执行输出的结果是&#xff1f; import math print("【执行】print(math.gcd(6, 8))") print(math.gcd(6, 8)) print(&quo…

vue3项目 Element-Plus DatePicker日期选择器组件限制只能选择7天内

需求&#xff1a;时间选择器 只能选择7天及以内 <template><el-date-pickerv-model"valueDate"type"daterange"range-separator"⇀"start-placeholder"开始日期"end-placeholder"结束日期"format"YYYY-MM-DD&…

保姆级Decimal.js的使用(如何解决js精度问题)

精度问题控制台图样 如果银行的业务你这样做&#xff0c;不知道要损失多少钱&#xff0c;这样是不行的&#xff0c;计算的不准确是需要背锅的&#xff0c;我们给后端去做吧&#xff0c;其实我们前端也是可以做的&#xff0c;引入Decimal.js 01.引入Decimal.js decimal.js是使用…