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

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

算法思路:

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

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

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

from myRandom import randomint_LCGdef 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'] = capacitygood['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:breakprint("最佳商品选择:{}".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 = 10print("背包容量:{}".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()) % 54321c = int(time.time()) % 12345x_0 = int(time.time()) % 78945random_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.hqwc.cn/news/176073.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】堆(Heap):堆的实现、堆排序、TOP-K问题

目录 堆的概念及结构 ​编辑 堆的实现 实现堆的接口 堆的初始化 堆的打印 堆的销毁 获取最顶的根数据 交换 堆的插入&#xff08;插入最后&#xff09; 向上调整&#xff08;这次用的是小堆&#xff09; 堆的删除&#xff08;删除根&#xff09; 向下调整&#xff08;这次用的…

Redis05-集群方案

目录 Redis集群方案 主从复制 主从复制的基本原理 主从复制的工作流程 乐观复制 主从复制的优势 哨兵机制 哨兵的关键作用 服务状态监控 哨兵选举Master规则 分片集群 分片集群中的数据读写 数据写入 数据读取 一致性哈希和客户端分片 Redis集群方案 微服务时代…

从理论到实践:深度解读BIO、NIO、AIO的优缺点及使用场景

文章目录 BIO优缺点示例代码 NIO优缺点示例代码 AIO优缺点示例代码 总结 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 BIO、NIO和AIO是Java编程语言中用于处理输入输出&#xff08;IO…

iOS OpenGL ES3.0入门实践

一、效果图 入门实践&#xff0c;做的东西比较简单&#xff0c;效果如下&#xff1a; 二、关于顶点坐标和纹理坐标 绘制图片需要设置顶点坐标和纹理坐标并加载像素数据&#xff0c;之所以要指定两组坐标是因为纹理和顶点使用不同的坐标系&#xff0c;就是告诉OpenGL&#xf…

GZ038 物联网应用开发赛题第3套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 &#xff08;第3套卷&#xff09; 工位号&#xff1a;______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具&#xff0c;操作安全规范&#xff1b; 2、竞赛过程中如有异议&#xff0c;可向现场考评…

【LIUNX】配置缓存DNS服务

配置缓存DNS服务 A.安装bind bind-utils1.尝试修改named.conf配置文件2.测试nslookup B.修改named.conf配置文件1.配置文件2.再次测试 缓存DNS服务器&#xff1a;只提供域名解析结果的缓存功能&#xff0c;目的在于提高数据查询速度和效率&#xff0c;但是没有自己控制的区域地…

后台系统更改主题【el-color-picker】

Element el-color-picker 颜色选择器的使用 设置的页面 <script setup lang"ts"> import { getThemeColor } from "../../utils/colorChange"; import { useUserStore } from "/store/index"; import { reactive } from "vue"…

高防IP可以抵御哪些恶意攻击

高防IP协议可以隐藏用户的站点&#xff0c;使得攻击者无法发现恶意攻击的目标网络资源&#xff0c;从而提高了源站的安全性。能够有效抵御常见的恶意攻击类型ICMPFlood、UDPFlood、 TCPFlood、SYNFlood、ACKFlood等&#xff0c;帮助游戏、金 融、电子商务、互联网、政企等行业抵…

Linux---(五)三大工具yum、vim、gcc/g++

文章目录 一、yum工具1.Linux中安装软件的方法&#xff1a;2.什么是yum?3.yum源更新 二、Linux编辑器--vim1.IDE例子2.vim&#xff08;1&#xff09;vim的常用模式及切换模式&#xff08;2&#xff09;底层模式常用命令&#xff08;3&#xff09;插入模式常用命令&#xff08;…

Mac安装与配置eclipse

目录 一、安装Java&#xff1a;Mac环境配置&#xff08;Java&#xff09;----使用bash_profile进行配置&#xff08;附下载地址&#xff09; 二、下载和安装eclipse 1、进入eclipse的官网 (1)、点击“Download Packages ”​ (2)、找到macOS选择符合自己电脑的框架选项&am…

比较LeNet、AlexNet、VGG和ResNet模型及其优缺点的实际实验。

一、说明 卷积神经网络&#xff0c;有很多种类&#xff0c;这不仅仅是各种试验或尝试。而且是已经设计好的网络存在若干不尽人意之处&#xff0c;需要弥补和改进。因此&#xff0c;本文就是记录这些网络的优缺点&#xff0c;从新意上说&#xff0c;本文全无&#xff0c;但是从启…

Java学习笔记(七)——面向对象编程(中级)

一、IDEA &#xff08;一&#xff09;常用的快捷键 &#xff08;二&#xff09;模版/自定义模版 二、包 &#xff08;一&#xff09;包的命名 &#xff08;二&#xff09;常用的包 &#xff08;三&#xff09;如何引入&#xff08;导入&#xff09;包 &#xff08;四&am…