python 背包问题 动态规划

问题分析子问题界定:由参数 k 和 y 界定k:考虑对物品1, 2, … , k 的选择
y:背包总重量不超过 y
原始输入:k = n, y = b
子问题计算顺序: k = 1, 2, … , n
对于给定的 k,y = 1, 2, … , b
定义问题
假设有 n 个物品和一个最大承重为 W 的背包。每个物品 𝑖i 有一定的重量 wi 和价值 vi。我们的目标是选择一些物品装入背包,使得总重量不超过 W,且总价值最大。
动态规划数组定义
定义一个二维数组 dp,其中 dp[i][j] 表示从前 𝑖i 个物品中选取一些,使得总重量不超过 j 时的最大价值。
初始条件
初始化 𝑑𝑝[0][𝑗]=0对所有 j 成立,因为没有物品时,无论背包容量如何,可装入的最大价值都是 0。

转移方程
对于每个物品 i 和每种背包容量 j:
如果不选择物品 i:则 dp[i][j]=dp[i−1][j]
如果选择物品 i(前提是 𝑗≥𝑤i):则 dp[i][j]=max(dp[i−1][j],dp[i−1][j−wi]+vi)
dp[i][j]=max(dp[i−1][j],dp[i−1][j−wi]+vi)
这个方程的含义可以这样理解:

  1. dp[i−1][j]: 这部分表示如果我们不选择当前的物品 i,则问题就退化为“从前i−1 个物品中选择,背包容量为 j 的情况”。在这种情况下,我们已经在上一个状态计算出了不包括物品 i 时的最大价值。
  2. dp[i−1][j−wi]+vi: 这部分表示如果我们选择了当前的物品 i,则背包剩余的容量将减少 wi(物品 i 的重量),因此我们需要考虑的子问题变为“从前 i−1 个物品中选择,背包容量为 j−wi 的情况”。由于我们选择了物品 i,我们必须在此基础上加上物品 i 的价值 vi。
def knapsack(n, b, v, w):''':param n: 物品有n种:param b: 背包容量:param v: 物品价值:param w: 物品重量:return: 最大价值'''# 初始化V = [[0 for _ in range(b + 1)] for _ in range(n + 1)]  # V[i][j] 表示前i个物品放入容量为j的背包的最大价值for i in range(n + 1):  # 应该到n+1,包含所有物品for j in range(b + 1):  # 应该到b+1,包含背包的完整容量if i == 0 or j == 0:  # 初始化 当i=0或j=0时,表示前i个物品放入容量为j的背包的最大价值为0V[i][j] = 0elif j < w[i - 1]:  # 注意这里的索引应该是i-1,因为列表是从0开始 表示前i个物品放入容量为j的背包的最大价值为前i-1个物品放入容量为j的背包的最大价值V[i][j] = V[i - 1][j]else:  # 当j>=w[i-1]时,选择放入物品i或不放入V[i][j] = max(V[i - 1][j], V[i - 1][j - w[i - 1]] + v[i - 1])# 回溯部分solution = []i, j = n, bwhile i > 0 and j > 0:if V[i][j] != V[i - 1][j]:  # 如果选择了物品isolution.append(i - 1)  # 添加物品i到解决方案 列表中 因为索引从0开始 所以要减1j -= w[i - 1]  # 更新剩余背包容量i -= 1  # 更新物品索引else:  # 如果V[i][j]等于V[i - 1][j],这意味着第i个物品没有被选中,因为不考虑这个物品我们可以得到相同的最大价值。因此,只需要简单地将物品索引i减1,继续考虑下一个物品。i -= 1# 返回最大价值和选择的物品列表return V[n][b], [v[i] for i in reversed(solution)]if __name__ == '__main__':n = 4b = 10v = [1, 3, 5, 9]w = [2, 3, 4, 7]max_value, solution = knapsack(n, b, v, w)print(f"最大价值为: {max_value}")print(f"选择的物品: {solution}")

回溯部分从V[n][b]开始,通过比较当前状态V[i][j]和V[i - 1][j]来判断是否将第i个物品放入背包中。如果当前状态的价值不是由前一个物品的价值转移而来,说明第i个物品没有被选中;否则,第i个物品被选中,更新背包容量j并继续回溯。
4. 在循环体内,首先检查V[i][j]和V[i - 1][j]的值。这两个值的含义如下:
○ V[i][j]:考虑前i个物品,背包容量为j时的最大价值。
○ V[i - 1][j]:考虑前i - 1个物品,背包容量为j时的最大价值。
5. 如果V[i][j]不等于V[i - 1][j],这意味着在将第i个物品放入背包时,我们得到了更高的价值。因此,执行以下操作:
○ 将物品i - 1(因为数组是从0开始索引的)添加到解决方案列表solution中。
○ 从剩余背包容量j中减去物品i - 1的重量w[i - 1],因为背包中加入了这个物品。
○ 将物品索引i减1,继续考虑下一个物品。
6. 如果V[i][j]等于V[i - 1][j],这意味着第i个物品没有被选中,因为不考虑这个物品我们可以得到相同的最大价值。因此,只需要简单地将物品索引i减1,继续考虑下一个物品。

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

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

相关文章

【Spring】IOC/DI中常用的注解@Order与@DependsOn

目录 1、Order 注解改变Bean自动注入的顺序 1.1、了解SpringBootTest注解 1.2、Order 注解改变Bean自动注入的顺序 2、DependsOn 改变Bean的创建顺序 1、Order 注解改变Bean自动注入的顺序 在sping中&#xff0c;通过IOC&#xff08;控制反转&#xff09;和DI&#xff08;依…

文本向量化模型新突破——acge_text_embedding勇夺C-MTEB榜首

在人工智能的浪潮中&#xff0c;以GPT4、Claude3、Llama 3等大型语言模型&#xff08;LLM&#xff09;无疑是最引人注目的潮头。这些模型通过在海量数据上的预训练&#xff0c;学习到了丰富的语言知识和模式&#xff0c;展现了出惊人的能力。在支撑这些大型语言模型应用落地方面…

文件操作(1)

为什么使⽤⽂件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久化的…

各平台奇怪问题备忘录

微信小程序 小程序报错Page 页面路径 has not been register yet 描述&#xff1a;uniapp做微信小程序开发时&#xff0c;新增某页面后&#xff0c;小程序跳转该页面报错Page 页面路径 has not been register yet 已知&#xff1a;page.json已添加该页面&#xff0c;小程序a…

B端设计实战:基于角色属性的权限设计

编辑导读:“权限控制”是中后台的基础能力,用于管控操作人员在平台内可做的事项内容。即通过权限控制,可以决定哪些人在平台内可以做哪些事。本文作者围绕角色&属性的权限设计展开分析,希望对你有帮助。 Hello,我是一名交互设计师。 随着3月暖春的即将到来,苏州的疫…

bugku-杂项-社工进阶收集

下载附件 得到图片 利用百度地图查找 这里得到地点名称大雁塔音乐喷泉 陕西省西安市&#xff0c;大雁塔北广场 打开高德地图 来到大雁塔北广场 因为在北广场&#xff0c;所以地铁站为大雁塔站 开始分析 坐七站到大雁塔站&#xff0c;即始发站为韦曲南站 因为始发站离她家800米&…

高频前端面试题汇总之HTML篇

1. src和href的区别 src和href都是用来引用外部的资源&#xff0c;它们的区别如下&#xff1a; src&#xff1a; 表示对资源的引用&#xff0c;它指向的内容会嵌入到当前标签所在的位置。src会将其指向的资源下载并应⽤到⽂档内&#xff0c;如请求js脚本。当浏览器解析到该元素…

34. BI - 美国大学生足球队的 GCN 案例

本文为 「茶桁的 AI 秘籍 - BI 篇 第 34 篇」 文章目录 美国大学生足球队 Embedding&#xff08;GCN&#xff09; Hi&#xff0c;你好。我是茶桁。 在上一节课中&#xff0c;因为需要&#xff0c;我们先是回顾了一下 Graph Embedding&#xff0c;然后跟大家讲解了 GCN 以及其算…

linux驱动-CCF-0基础

1. 时钟设备 晶振&#xff1a;提供基础时钟源的&#xff08;可分为有源晶振、无源晶振两种&#xff09;&#xff1b; PLL: 用于倍频的锁相环&#xff1b; mux: 用于多路时钟源选择&#xff1b; Divider: 用于分频的&#xff1b; gate: 用于时钟使能的与门电路等 2. CCF…

Python读写文本URL蓝牙WIFI自动连接电子名片位置坐标智能海报等NDEF标签

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c.w4002-21818769070.11.60ad789erlonvk 近场通信&#xff08;Near Field Communication&#xff0c;简称NFC&#xff09;&#xff0c;是一种新兴的技术&…

技术速递|Java on Azure Tooling 3月更新 - Java on Azure 开发工具未来六个月路线图发布

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division At Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 工具的三月更新。在本次更新中&#xff0c;我们将分享未来几个月对 Java on Azure 开发工具的投资。此外&#xff0c;我…

Redis入门到通关之数据结构解析-Dict

文章目录 概述构成Dict的扩容Dict的rehash总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开…

SpringBoot引入第三方jar包或本地jar包

idea2018创建spring boot项目 New Project窗口选择Spring Initializr Type选择Maven(Generate…),有两个Maven选择这一个。 勾选Spring Web。 pom.xml中version改成2.5.10。 在resources中新建jar目录&#xff0c;将第三方jar包fastjson2-2.0.47.jar放入其中。&#xff08…

国产FTP文件传输服务器需要具备哪些关键特性?

国产FTP文件传输服务器是指根据中国国内信息技术创新&#xff08;信创&#xff09;的要求和标准&#xff0c;自主研发的文件传输服务器软件。这类软件旨在替代传统的FTP服务器&#xff0c;以更好地适应国产化和信息安全的需要。国产FTP文件传输服务器通常需要具备以下要求&…

【ensp】网关冗余vrrp实验

基础文字知识复习时&#xff0c;添加&#xff0c;下文仅拓扑以及核心配置以及结果分析 冗余路由器 核心代码&#xff1a; int g0/0/0 [R1-GigabitEthernet0/0/0]vrrp vrid 1 virtual-ip 192.168.10.1 ###设置虚拟ip [R1-GigabitEthernet0/0/0]vrrp vrid 1 priority 120 …

零碳家庭 “光”的力量

有行业专家乐观预测&#xff0c;在供给充足、基础设施建设与时俱进的情况下&#xff0c;2025年&#xff0c;我国新能源汽车市场的占有率将会达到50%&#xff0c;2030年更有望突破90%的大关。为了方便新能源汽车的出行&#xff0c;在家中安装一个智能充电桩是越来越多驾驶者的选…

分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测

分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测 目录 分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.RIME-BP霜冰优化BP神经网络多特征分类预测&#xff08;Matlab实现完整源码和数据&a…

免杀技术之白加黑的攻击防御

一、介绍 1. 什么是白加黑 通俗的讲白加黑中的白就是指被杀软列入到可信任列表中的文件。比如说微软自带的系统文件或者一些有有效证书签名的文件,什么是微软文件&#xff0c;或者什么是有效签名文件在后面我们会提到他的辨别方法。黑就是指我们自己的文件&#xff0c;没有有…

【MCU】栈溢出问题

项目场景&#xff1a; 硬件&#xff1a;STM32F407&#xff0c;操作系统&#xff1a;rt_thread master分支 问题描述 问题栈溢出 id 499 ide 00 rtr 00 len 8 9 Function[rt_completion_wait] shall not be used in ISR (0) assertion failed at function:rt_completion_wait,…

屏幕状态自动检测+鼠标自动操作

目录 一、写在前面 1.1适用场景 1.2涉及到的库 二、函数库 2.1pyautogui-屏幕截图&鼠标操作 2.1.1屏幕截图screenshot函数 2.1.2鼠标移动及单击 2.2Opencv-模板匹配 2.2.1matchTemplate函数 2.2.2minMaxLoc函数 2.2.3相关代码 2.3base64-图片转base64 2.3.1在线…