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

贪心算法——分数背包问题

一、背景介绍

给定𝑛个物品,第𝑖个物品的重量为𝑤𝑔𝑡[𝑖−1]、价值为𝑣𝑎𝑙[𝑖−1],和一个容量为𝑐𝑎𝑝的 背包。每个物品只能选择一次,但可以选择物品的一部分,价值根据选择的重量比例计算,问:在不超过背包容量下背包中物品的最大价值。

如下图所示,我们可以对物品任意地进行切分,并按照重量 比例来计算物品价值。

1. 对于物品𝑖,它在单位重量下的价值为𝑣𝑎𝑙[𝑖−1]/𝑤𝑔𝑡[𝑖−1],简称为单位价值

2. 假设放入一部分物品𝑖,重量为𝑤,则背包增加的价值为𝑤×𝑣𝑎𝑙[𝑖−1]/𝑤𝑔𝑡[𝑖−1]。

二、具体实现

1. 贪心策略确定

最大化背包内物品总价值,本质上是要最大化单位重量下的物品价值。由此便可推出下图所示的贪心策略。

1)将物品按照单位价值从高到低进行排序。

2)遍历所有物品,每轮贪心地选择单位价值最高的物品。

3)若剩余背包容量不足,则使用当前物品的一部分填满背包即可。

2.代码实现

我们建立了一个物品类Item,以便将物品按照单位价值进行排序。循环进行贪心选择,当背包已满时跳出并 返回解。

class Item:"""物品"""def __init__(self, w: int, v: int):self.w = w  # 物品重量self.v = v  # 物品价值def fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:"""分数背包:贪心"""# 创建物品列表,包含两个属性:重量、价值items = [Item(w, v) for w, v in zip(wgt, val)]# 按照单位价值 item.v / item.w 从高到低进行排序items.sort(key=lambda item: item.v / item.w, reverse=True)# 循环贪心选择res = 0for item in items:if item.w <= cap:# 若剩余容量充足,则将当前物品整个装进背包res += item.vcap -= item.welse:# 若剩余容量不足,则将当前物品的一部分装进背包res += (item.v / item.w) * cap# 已无剩余容量,因此跳出循环breakreturn res"""Driver Code"""
if __name__ == "__main__":wgt = [10, 20, 30, 40, 50]val = [50, 120, 150, 210, 240]cap = 50n = len(wgt)# 贪心算法res = fractional_knapsack(wgt, val, cap)print(f"不超过背包容量的最大物品价值为 {res}")

最差情况下,需要遍历整个物品列表,因此时间复杂度为𝑂(𝑛),其中𝑛为物品数量。

由于初始化了一个Item对象列表,因此空间复杂度为𝑂(𝑛)

三、正确性证明

采用反证法

假设物品𝑥是单位价值最高的物品,使用某算法求得最大价值为res,但该解中不包含物品𝑥 。 现在从背包中拿出单位重量的任意物品,并替换为单位重量的物品𝑥。由于物品𝑥的单位价值最高,因此替 换后的总价值一定大于res。这与res是最优解矛盾,说明最优解中必须包含物品𝑥。 对于该解中的其他物品,我们也可以构建出上述矛盾。总而言之,单位价值更大的物品总是更优选择,这说 明贪心策略是有效的。

如下图所示,如果将物品重量和物品单位价值分别看作一个2D图表的横轴和纵轴,则分数背包问题可被转化为“求在有限横轴区间下的最大围成面积”。这个类比可以帮助我们从几何角度理解贪心策略的有效 性。

 

 

相关文章:

  • 元宇宙赛道新势力:芯谷产业园创新业务如何重构产业格局
  • 页面置换算法概述
  • CaDDN- Categorical Depth Distribution Network for Monocular 3D Object Detection
  • PYTORCH_CUDA_ALLOC_CONF基本原理和具体示例
  • DDR5和LPDDR5的CA采样时刻对比,含DDR5的1N/2N模式
  • redis搭建最小的集群,3主3从
  • 华为昇腾开发——多模型资源管理(C++)
  • flutter dart class语法说明、示例
  • 微信小程序 隐私协议弹窗授权
  • 关于数据仓库、数据湖、数据平台、数据中台和湖仓一体的概念和区别
  • 视频文件损坏怎么修复?4款专业视频修复工具推荐
  • 大模型应对大风等极端天气的卓越效果及其在能源预测中的特殊价值
  • 即将截稿|快速出版:IEEE 2025先进能源系统和电力电子国际会议(AESPE2025)
  • 广州能源所重大突破:闪蒸焦耳加热助力粉煤灰 / 赤泥中关键金属低碳回收
  • 数字孪生技术如何重塑能源产业?
  • 2025年气候持续大风,消纳减少,如何保收益?东润能源整体解决方案持续保收益保增长
  • 零碳办会新范式!第十届国际贸易发展论坛——生物能源和可持续发展专场,在京举办
  • SpringAI 大模型应用开发篇-SpringAI 项目的新手入门知识
  • Femap许可证兼容性问题
  • 并发编程 之 Java内存模型、AQS详解:AQS设计思想、Unsafe
  • 网站支付开发/购买友情链接
  • 养老网站建设 中企动力/百度优化服务
  • 手机微网站建设案例及报告/郑州网络推广专业公司
  • 移动端下拉框价威cj111602推广/长沙seo优化首选
  • 工程施工合同协议书范本/seo监控
  • 音乐网站前台模板/百度网页版网址