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

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

算法思路:

  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

运行测试:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023亚太杯数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

苹果独占鳌头,国产手机围攻,双十一“照妖镜”显露谁有真实力

随着双十一购物节的结束&#xff0c;电商平台也给出了各手机品牌的销量数据&#xff0c;苹果毫无疑问成为双十一的赢家&#xff0c;不过两家国产手机品牌也显露了他们的实力&#xff0c;已具有与苹果一战之力。 与去年双十一和今年618类似&#xff0c;苹果仍然占据热销榜前列&a…

信驰达科技加入车联网联盟(CCC),推进数字钥匙发展与应用

CCC)的会员。 图 1 深圳信驰达正式成为车联网联盟(CCC)会员 车联网联盟(CCC)是一个跨行业组织&#xff0c;致力于推动智能手机与汽车连接解决方案的技术发展。CCC涵盖了全球汽车和智能手机行业的大部分企业&#xff0c;拥有150多家成员公司。CCC成员公司包括智能手机和汽车制造…

TLP超线程技术

在实现IPL指令级并行的同时实现TLP(Thread Level Parallelism)线程级并行实现多线程有两种主要的方法超线程即同时多线程&#xff0c;在单个处理器或单个核中设置了两套线程状态部件&#xff0c;共享高速缓存和功能部件当两个线程同时需要某个资源时&#xff0c;其中一个线程必…

Mac 本地部署thinkphp8【配置环境】

PHP开发工具 我这里选择的是VSCode,里面安装PHP插件 把thinkphp的项目放到 切换到phpenv ![在这里插入图片描述](https://img-blog.csdnimg.cn/a15cc442fab74754ad86d74f6d9942e5.png URL重写如果不改&#xff0c;在请求的时候地址是这样的‘http://tp.com/index.php…

Prim算法(C++)

目录 介绍&#xff1a; 代码&#xff1a; 结果&#xff1a; 介绍&#xff1a; Prim算法是一种用于解决最小生成树问题的贪心算法。该算法的主要思想是从一个顶点开始&#xff0c;不断向图中添加边&#xff0c;直到构成一棵包含所有顶点的生成树&#xff0c;使得树的边权之…

安全认证框架Shrio学习,入门到深度学习,SpringBoot整合Shiro小案例,含代码

权限概述 什么是权限 什么是权限 权限管理&#xff0c;一般指根据系统设置的安全策略或者安全规则&#xff0c;用户可以访问而且只能访问自己被授权的资源&#xff0c;不多不少。权限管理几乎出现在任何系统里面&#xff0c;只要有用户和密码的系统。 权限管理再系统中一般分…

麒麟信安:助力医疗行业操作系统自主创新,提升可靠性与安全性

应用场景 湖南省康复医院是省卫生健康委直属公立三级康复医院&#xff0c;也是全省唯一一所集预防、医疗、康复、科研、教学、健康管理为一体的省级三级公立康复医院。 湖南省康复医院使用的医慧管平台由湖南蓝途方鼎科技有限公司开发&#xff0c;利用互联网技术&#xff0c;…

卫星通信和800MHz双管齐下,中国电信对中国移动发起新挑战

依靠国内某科技企业的宣传&#xff0c;卫星通信大热&#xff0c;中国电信也由此成为受益者&#xff0c;日前中国电信又大举招标25万座800MHz 5G基站&#xff0c;显示出中国电信积极以技术优势挑战中国移动。 一、中国电信急起直追 自从4G时代以来&#xff0c;中国电信就在国内通…

EXTI (2)

增强版实验简介 EXTI5和EXTI9共享一个中断源 下面的类似 EXTI0到4各自拥有一个中断源 改变引脚 PA0和PA1改变为PA5 和PA6 EXTI的重映射 之前是把PA0映射到EXTI0 PA1映射到EXTI1上 现在是要把PA5和PA6分别映射到EXTI5和6上 EXTI进行初始化 NVIC初始化 编写中断函数 因为EXTI…

Apktool反编译和重新打包

Apktool 使用 1&#xff1a;linux安装apktool 可以直接查询下version apktool -v 如果未安装&#xff0c;会得到如下结果&#xff1a; Command apktool not found, but can be installed with:sudo snap install apktool # version 2.7.0, or sudo apt install apktool …

SSH全能终端工具mobaXterm(远程工具)使用教程

参考文章&#xff1a;SSH全能终端工具MobaXterm Personal v23.0 完全汉化绿色版 参考文章&#xff1a;MobaXterm 23终端控制软件 文章目录 SSH全能终端工具mobaXterm使用教程目录引言mobaXterm概述安装与配置下载mobaXterm安装过程基础设置 SSH连接创建SSH会话SSH命令行操作文…

Linux 源码包安装

SRPM 包&#xff0c;比 RPM 包多了一个“S”&#xff0c;是“Source”的首字母&#xff0c;所以 SRPM 可直译为“源代码形式的 RPM 包”。也就是说&#xff0c;SRPM 包中不再是经过编译的二进制文件&#xff0c;都是源代码文件。可以这样理解&#xff0c;SRPM 包是软件以源码形…

力扣周赛371复盘(总结与进步)

比赛结果 第一题 2932. 找出强数对的最大异或值 I - 力扣&#xff08;LeetCode&#xff09; 这个由于是简单题&#xff0c;暴力for循环即可 通过结果如下&#xff1a; class Solution {public int maximumStrongPairXor(int[] nums) {int ans0;for(int i 0;i<nums.length;…

Python 日志记录器logging 百科全书 之 日志回滚

Python 日志记录器logging 百科全书 之 日志回滚 前言 在之前的文章中&#xff0c;我们学习了关于Python日志记录的基础配置。 本文将深入探讨Python中的日志回滚机制&#xff0c;这是一种高效管理日志文件的方法&#xff0c;特别适用于长时间运行或高流量的应用。 知识点&…

深入了解springmvc响应数据

目录 一、前后端分离开发与混合开发 1.1 混合开发模式 1.2 前后端分离模式【重点】 二、页面跳转控制 2.1 通过JSP实现页面跳转 2.2 转发与重定向 三、返回JSON数据 3.1 导包与配置 3.2 使用ResponseBody 四、返回静态资源 4.1 为什么无法直接查询静态资源 4.2 配置…

45 深度学习(九):transformer

文章目录 transformer原理代码的基础准备位置编码Encoder blockmulti-head attentionFeed Forward自定义encoder block Deconder blockEncoderDecodertransformer自定义loss 和 学习率mask生成函数训练翻译 transformer 这边讲一下这几年如日中天的新的seq2seq模式的transform…

简洁高效的微信小程序分页器封装实践

前言 在现今的移动应用开发中&#xff0c;微信小程序已经成为了一个备受欢迎的平台。然而&#xff0c;随着应用的复杂性增加&#xff0c;数据的管理和加载成为了一个问题。本文将探讨微信小程序中的一个关键概念&#xff1a;封装分页器&#xff0c;它是提升小程序性能和用户体验…

Windows如何正确设置PHP环境变量以在Git Bash中运行命令

1、随便找一个目录&#xff0c;鼠标右键打开git bash here 2、cd的根目录 3、找到php安装目录 4、 在根目录下打开 vim .bash_profile &#xff0c;添加环境变量&#xff0c;php地址根据自己的本地地址而定 PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.3.4nts 添加后保存…

计算机网络期末复习-Part5

1、CRC计算 看例题&#xff1a;待发送序列为101110&#xff0c;生成多项式为X31&#xff0c;计算CRC校验码 先在待发送序列末尾添加与生成多项式次数相同的零&#xff0c;在上述例子中&#xff0c;生成多项式是X^3 1&#xff0c;所以需要添加3个零&#xff0c;待发送序列变成…