动态规划和 0/1 背包

2023-12-28

尽管我已经阅读了很多资源试图理解动态编程,但我在理解动态编程方面遇到了一些困难。

我理解使用斐波那契算法给出的动态规划的示例。我明白如果你使用分而治之的方法,你最终会多次解决一些子问题,而动态编程通过解决这些重叠的子问题但只解决一次(并存储它们以供将来参考)来解决这个问题。然而,我在课堂上以 0/1 背包问题为例介绍了动态规划,但我并不真正理解这个示例,或者它如何说明动态规划,或者它与斐波那契示例有何相似之处。

以下是与之相关的幻灯片:

我主要了解发生了什么,直到最后一张幻灯片,上面写着 f(i,y) = max{....}

我到底找到了什么最大值?为什么我要找到任何事物的最大值?最重要的是,这与动态规划有什么关系?我不明白其中的关系,就像我在斐波那契例子中所做的那样。老实说,我不知道这个背包问题与动态规划有什么关系,因为它甚至看起来与使用斐波那契示例来说明动态规划没有可比性。就像我根本看不到任何相似之处或任何东西,这对我来说真的没有多大意义


动态规划只是用更简单的子问题来定义问题。

就斐波那契数列而言,我们用两个较小的项来定义问题。

在这种情况下,我们根据包含较少项目和可能较小容量的子问题来定义具有一定数量项目和一定容量的问题。

我们首先计算最多 1 个项目和每个容量的利润。然后我们计算最多 2 个项目和每个容量的利润。然后我们最多对 3 个项目执行此操作,然后是 4 个,依此类推。由于我们已经根据具有较少项目的子问题定义了一个问题,因此我们可以简单地查找我们已经计算的内容来确定具有 2、3、4 等项目的任何值。

将其视为物理 2D 网格可能会有所帮助,您可以在其中从一个方向到另一个方向填充值,并且每次您只查看所有值已填充的方向。

存在重叠的子问题,因为在一种情况下我们使用相同的容量,而在另一种情况下我们使用较小的容量。较小的容量有时会匹配检查相同容量的不同子问题。也就是说f(i+1, j)因为一个问题将等于f(i+1, y - w_i)对于另一个问题。作为示例,您可以看到f(11, 5)出现在2个地方:

f(10, 8) = max(f(11, 8), f(11, 5) + 77)   // w_i = 3
f(10, 5) = max(f(11, 5), f(11, 2) + 77)

在这种情况下我们已经计算过f(11, X)对于每一个X,所以我们可以查找这些值。

我确实觉得我们用增加来定义问题有点令人困惑i, as in f(i, j) = ...f(i+1, X)...然后f(n, X)因此最多包含 1 项,而不是使用递减i并且最多有 1 件物品f(1, X)。但这只是语义,并不能以任何方式改变问题。

技术细节说明

f(i,y)是包含项目子集的最大利润i通过n容量为y.

现在我们可以将其定义为包含或排除项目i,然后获得物品的最大利润i+1通过n.

当我们排除项目时i,这不会改变重量,所以我们可以只看相同容量下的最大利润,即f(i+1, y),利润也不变。

当我们包括项目时i,这会改变重量,特别是物品的重量i,即w_i,所以我们必须查找f(i+1, y - w_i)。但我们也从 item 中获得利润i,所以我们需要加上它的利润,即p_i.

现在,由于我们想要最大利润,我们必须找到这两个值的最大值,给出:

f(i, y) = max{f(i+1, j), f(i+1, y - w_i) + p_i}

如果您仍然无法理解它,我建议您为自己构建一个示例来完成 - 没有多少解释足以看到它实际工作,并使用它来获得一些直觉,了解为什么我们这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划和 0/1 背包 的相关文章

  • 依赖解析算法

    我正在编写一个包管理器 为此我希望依赖项解析尽可能强大 每个包都有一个版本列表 每个版本包含以下信息 具有可比性的 ID 依赖关系 软件包列表以及每个软件包的一组可接受的版本 冲突 软件包列表以及每个软件包的一组与该版本一起导致问题的版本
  • 贪心技术与穷举搜索有何不同?

    我正在为一些示例问题编写伪代码 并且我注意到贪婪技术和详尽搜索之间存在令人担忧的模式 Job 1 Job 2 Job 3 Job 4 Job 5 Person 1 9 2 7 8 Person 2 6 4 3 7 Person 3 5 8
  • 布隆过滤器的使用

    我正在努力理解布隆过滤器的用处 我了解了它的底层逻辑 空间压缩 快速查找 误报等 我只是不能将这个概念应用到现实生活中 因为它是有益的 一种常见的应用是在 Web 缓存中使用布隆过滤器 我们使用布隆过滤器来确定给定的 URL 是否在缓存中
  • 2D形状识别与解析算法

    我正在寻找一种算法 用于从给定的一组 x y 点检测简单形状 如矩形 三角形 正方形和圆形 我还在寻找一种方法 一旦检测到 将路径转换为更干净的形状 我已经查遍了互联网 但没有找到任何 简单 的方法 几乎所有这些对于我的简单实现来说都是高级
  • 基于 2 个输入的伪随机数生成器 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我需要根据 2 个输入值 X 和 Y 生成一个伪随机数 给定相同的 X 和 Y 值 我需要得到相同的结果 结果应介于 0 和 1 之间 含
  • 依次构建完整的 B 树

    如果我有一组排序的数据 我想以最适合顺序读取和随机查找的方式将其存储在磁盘上 那么 B 树 或其中一个变体 似乎是一个不错的选择 假设该数据集并不全部适合 RAM 问题是可以从一组排序的数据构建完整的 B 树而不进行任何页面拆分吗 这样排序
  • 测量数组的“无序”程度

    给定一个值数组 我想找到总 分数 其中每个元素的分数是数组中出现在其之前的具有较小值的元素的数量 e g values 4 1 3 2 5 scores 0 0 1 1 4 total score 6 O n 2 算法很简单 但我怀疑可以通
  • 最接近 x,y 的线上的点[重复]

    这个问题在这里已经有答案了 可能的重复 如何判断一个点是否在某条线附近 https stackoverflow com questions 910882 how can i tell if a point is nearby a certa
  • 字符串的渐进单词组合

    我需要获得字符串的渐进单词组合 例如 这是字符串 输出 这是字符串 这是 这个字符串 是字符串 这 是 细绳 你知道类似的算法吗 我需要php语言 谢谢 这是解决您问题的简单代码 我将每个字符串递归地连接到数组中的其余字符串 string
  • 分组符号最大长度平衡子序列

    将 B 视为分组符号 和 的序列 如果 B 的长度为 0 或 B 具有以下形式之一 则称 B 为平衡序列 X Y 或 X Y 或 X Y 其中 X 和 Y 本身是平衡的 平衡示例 现在的问题是找到一种有效的算法来找到给定输入的最大长度平衡子
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 逐字遍历句子

    如何逐字遍历任何给定的句子 java中有内置函数吗 我不知道如何开始 像这样的事情 String sentence Your sentence here String words sentence split s splits by whi
  • 为什么我们需要检测链表中的循环

    我看到很多关于如何检测链表中的循环的问答 但我想了解的是我们为什么要这样做 换句话说 检测链表中的循环的实际用例是什么 在现实生活中 您可能永远不需要检测链表中的循环 但是执行此操作的算法很重要 我在现实生活中多次使用它们 例如 我经常会递
  • 算法:找到圆中的峰值

    Given n排列成圆圈的整数显示了一种可以找到一个峰值的有效算法 峰值是不小于它旁边的两个数字的数字 一种方法是遍历所有整数并检查每个整数以查看它是否是峰值 这产生O n 时间 似乎应该有某种方法来分而治之 以提高效率 EDIT 好吧 基
  • 打印从 1 到 100 的质数

    此 C 代码打印出以下素数 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 但我不认为这就是我的书所希望的写作方式 它提到了一些关于数字的平方根的内容
  • 将 n 个可变高度图像拟合为 3 个(相似长度)列布局

    我正在寻找类似于的 3 列布局piccsy com http piccsy com 给定许多宽度相同但高度不同的图像 有什么算法可以对它们进行排序以使列长度的差异最小 最好使用 Python 或 JavaScript 非常感谢您提前的帮助
  • 为什么使用 no-op 来填补 paxos 事件之间的空白是合法的?

    我正在学习Paxos算法 http research microsoft com en us um people lamport pubs paxos simple pdf http research microsoft com en us
  • 仅使用两个变量交换两个数字

    它如何执行交换 a a b b a b a b a 我不同意把它换成书 书中的选项包括 a和b的值的补集 否定和b 希望这些选项也不能满足它 正确的算法应该是 a a b b a b a a b
  • 找到将一个数字转换为另一个数字的最小移动次数的算法

    假设我们有两个正整数 a 和 b 每次移动我们都可以将 a 除以 2 但前提是 a 是偶数 将 a 乘以 2 或者将 a 加 1 将a变为b需要多少步 找到一个直接公式或一种有效的算法 即以对数时间运行的算法 我取得的一些进展 我们可以把它
  • 为什么 n 按位和 -n 总是返回最右边的位(最后一位)

    这是Python代码片段 1 1 1 2 2 2 3 3 1 看来任何n n总是返回最右边 最后 位 我真的不知道为什么 有人可以帮助我理解这一点吗 这是由于负数以二进制表示的方式 称为二进制补码表示 创建某个数字 n 的补码 换句话说 创

随机推荐

  • 固定宽度、灵活高度的UILabel

    我在详细视图控制器中有一个 UILabel 因此其内容根据所选的表行而变化 我有一个问题 我会为 UILabel 设置固定宽度 并根据文本设置动态高度 我怎样才能做到这一点 我为我的错误感到抱歉 但我不是英国人 我喜欢子类化UILabel为
  • WCF:单个服务的多个绑定配置

    我正在开发一个必须支持向后兼容性的客户端服务器应用程序 NET 4 WPF WCF 换句话说 就操作合约和数据合约而言 旧客户端应该与新服务器兼容 反之亦然 我们的 WCF 服务托管在 IIS 中 它们were设置为使用 basicHttp
  • beta 二项式和 beta 分布的 alpha 和 beta 估计

    我正在尝试将我的数据拟合到 beta 二项式分布并估计 alpha 和 beta 形状参数 对于此分布 先验取自 beta 分布 Python 没有 beta 二项式的拟合函数 但有 beta python beta 拟合和 R beta
  • iphone-非全局uiimageview检测

    背景 我使用的是 XCode 3 1 4 请记住这一点 但请不要对此发表评论 我必须按下按钮 点火并启动 当按下火时 会使用 IBAction 函数创建一个名为 one 的 UIImageView 当按下开始键时 会创建一个名为 2 的 U
  • 无需 GUI 即可获取字体规格(控制台模式)

    假设一些图像必须由 Qt 控制台程序生成 并且字体规格内部算法需要 它们使用文字宽度 高度作为计算应发生绘图的位置的输入 该程序必须可以在没有任何 GUI 的 Linux 上运行 运行级别 3 基本上是没有任何显示服务器的集群 Proble
  • 如何在 PHP 中验证表单

    是使用 php 验证 PHP 表单然后出现错误进行重定向更好 还是使用 javascript 验证然后在启用 javascript 的情况下允许表单提交更好 You must验证服务器端的值 因为客户端不可信 You may验证客户端的值
  • 对 PHP 文件使用括号

    我目前正在运行 wampserver 并且正在尝试使用 Brackets io 实时预览 php 文件 但是 当我单击实时预览时 我得到了 Project settings for Getting Started Live preview
  • 在自定义元素 Shadow DOM 中选择槽文本

    我用常规的 html css js 制作了一个简单的复制粘贴组件 我尝试将其变成 Web 组件 但无法再使复制粘贴行为发挥作用 Shadow DOM 内的标记基本上是 span span
  • Mac OS X 想要在编译项目时使用系统钥匙串

    当我编译 Xcode 项目时 系统要求我输入系统管理员用户名和密码 整个消息是 Mac OS X 想要做出改变 输入管理员的名称和密码以允许执行此操作 Mac OS X 希望使用系统钥匙串 有人有解决方案吗 打开钥匙串访问 在左上角 解锁钥
  • 如何将内联 JavaScript 合并为一个?

    我正在修复我们在一个网站上使用的模板 其中包含以下代码 这个片段有效
  • C/C++ 函数指针的 UML 表示

    UML 结构图中 C C 函数指针 fp 的最佳表示是什么 我正在考虑使用接口元素 即使是 退化 但最多只能声明一个操作 I found some proposal in this document But this sounds quit
  • Android - getResources().getIdentifier 替换

    在 android 中 我循环遍历数据库并分配文本和图像 Cursor res myDb getAllData while res moveToNext Actors actor new Actors actor setName res g
  • XAML 相当于 HTML 中的 DIV?

    我想要更具体的是一个可以用于对一组其他元素进行分组的元素 而不影响它们的布局 除了通过将相关元素分组到其自己的父标记中来提供更好的 XAML 之外 它唯一应该做的就是传播环境属性 例如 DataContext 它应该是一个纯粹的逻辑元素 没
  • 从张量流模型获取权重

    您好 我想从张量流中微调 VGG 模型 我有两个问题 如何从网络获取权重 trainable variables 为我返回空列表 我使用了这里的现有模型 https github com ry tensorflow vgg16 https
  • 如何在播放框架中隐藏文本字段

    如何在播放框架中隐藏文本字段 例如如何隐藏该字段 inputText userProfileForm name label gt Name 这应该适用于所有浏览器 inputText userProfileForm name label g
  • Jenkins节点连接问题

    您好 我收到以下错误 但我的节点已启动 并且在詹金斯日志中一切正常 但在我的一些在节点上进行的作业中 我遇到了以下问题 12 59 29 EnvInject Loading node environment variables 12 59
  • PHP 和重音字符 (Ba\u015f\u00e7\u0131l)

    我有一个像 Ba u015f u00e7 u0131l 这样的字符串 我假设这些是一些特殊的重音字符 我如何能 1 显示带有重音符号的字符串 即用实际字符替换代码 2 存储这样的字符串的最佳实践是什么 2 如果我不想允许这样的字符 如何将其
  • 从 ASP.net Web 应用程序扫描文档

    我有一个 ASP Net C 4 0 Web 应用程序 我需要为我的用户添加扫描功能 这就是我想要实现的目标 在我的网络应用程序上 用户单击按钮 打开一个窗口 其中可预览连接到客户端系统的扫描设备中的文档 用户确认扫描 这将以 jpg pd
  • UIImageView子类需要处理resize

    我正在创建一个 UIImageView 子类来显示音频波形 方法是加载文件 进行数学计算 保存 PNG 文件 然后self image thePNG 这样做的好处是 在调整大小或重新绘制时 UIImageView 将拉伸 PNG 并快速拉伸
  • 动态规划和 0/1 背包

    尽管我已经阅读了很多资源试图理解动态编程 但我在理解动态编程方面遇到了一些困难 我理解使用斐波那契算法给出的动态规划的示例 我明白如果你使用分而治之的方法 你最终会多次解决一些子问题 而动态编程通过解决这些重叠的子问题但只解决一次 并存储它