【问题标题】:What is the link between table in knapsack problem and dynamic programming?背包问题中的表格与动态规划之间有什么联系?
【发布时间】:2019-05-22 04:27:16
【问题描述】:

对一个非常新手的问题表示歉意,因为我无法从各种资源中找到答案。

在背包算法中,我们构造一个表,例如在https://www.geeksforgeeks.org/0-1-knapsack-problem-dp-10/

我在 Kleinberg 的书中读到了背包问题。根据我的理解,动态编程是将问题分解为重叠的子问题 - 但是,我已经在各种书籍/在线资源中看到此表用于解决背包问题。我似乎无法理解这张表是如何与动态编程相关联的?我们是否在此表中记住任何内容?在我看来,这是一个巧妙的背包解决方案,但不是动态编程解决方案。我看过视频和文本,他们通过使用表格或使用动态编程解决方案来解决问题,但似乎没有人提供两者之间的联系。

【问题讨论】:

  • 观看 Erik Demaine 为 MIT OpenCourseWare 撰写的 Parenthesization, Edit Distance, Knapsack。他教如何在伪多项式时间内使用动态规划解决背包问题 - 从 43:15 开始。很棒的一课!
  • 谢谢,但还没有得到我的答复。视频中没有桌子。关于视频中的解决方案,我找到了类似的解决方案,但是当输入如下时会发生什么:{(5kg, $4), (2kg, $2), (5kg,$4), (2kg, $3)} [ kg 是重量,$ 是价值]。在递归解决方案中,在每一步中,我们都必须探索每个子问题的树(我们可以记住它),否则如果我们按顺序进行,那么结果将是 4 美元,而不是 5 美元的最佳解决方案。
  • 上例中背包容量为5kg。

标签: algorithm dynamic-programming knapsack-problem


【解决方案1】:

它仍然是动态编程。唯一的区别是动态规划算法在n 中仍然不是多项式,而是在nW 中。对于这些类型的问题,您必须区分由于输入而自然产生的值和输入的部分值。

你的输入由n不同的项目组成数字W; W 是显式的,而不是由输入的大小暗示的。因为我们使用了一些高效的编码(即二进制)来提供W,所以W 的大小在W 的编码中是指数。也就是说,输入包含表示W 的O(lg W) 位,但我们构建的表有W 行(或列,深入了解您如何查看它)。这使得算法的输入大小呈指数级增长。

但是,如果我们放宽我们通常的规则,即输入必须有效地表示,我们可以使用“一元”表示法指定WW 输入中的 1s 而不是二进制表示。现在您可以声称,因为输入大小在nW 中是多项式,而不是像以前那样在nlg W 中,所以DP 表在输入中也是多项式。

这大致是强和弱NP-hard的区别:如果问题是弱NP-hard,那么如果我们指定一些数值的一元编码,就可以找到多项式时间算法(通常基于动态规划)参数而不是通常的二进制编码。

【讨论】:

  • 什么是重叠子结构?
  • 不需要重叠子问题;这正是允许您在多项式时间内解决一些问题的原因(因为 distinct 子问题较少)。表是一样的,唯一的区别是我们测量它的大小的“单位”。
  • 表格与表格方法不同,选择下一个/记忆的子问题需要从第i个物品的重量中减去当前背包的重量,并以此计算的结果作为指标.这不是从动态规划的递归公式推导出来的——它似乎是一个非动态规划的解决方案。
  • 我指的是这种表格方式:geeksforgeeks.org/0-1-knapsack-problem-dp-10
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多