【问题标题】:Find the maximum weight that can be collected from a store under given limit找出在给定限制下可以从商店收集的最大重量
【发布时间】:2018-10-22 16:53:34
【问题描述】:

我在 SAP 实验室的分班考试中遇到了这个问题:

今天是你的生日,所以你会得到一个带有固定空格“S”的包。你可以去商店挑选你喜欢的物品,这些物品可以放在你的包里。商店有 'n' 件商品,每件商品占据一个空间 s[i]。你必须找出你可以装满的最大空间

例如,假设您的包限制为 S = 15,而商店有 10 件尺寸为 [1, 7, 3, 5, 4、10、6、15、20、8]。现在您可以通过各种方式填充 15 空间,例如 [1, 7, 3, 4], [7, 3, 5], [15], [5, 10] em> 等等。所以你返回15

注意: 物品的尺寸有问题。所有项目,但最多 15 遵循以下规则:*对于所有 i, j, 或者 size[i]>=2*size[j] +1size[j] >= 2*size[i] +1 如果 i ≠ j.*

约束:

1。

1.

1.

示例:S = 9,n = 5,大小 = [1, 7, 4, 4, 10]。

输出:8。您不能以任何方式准确地填充 9 空间。您可以使用 [1, 7][4, 4] 填充 8 个空格。

【问题讨论】:

  • 我试图通过回溯忽略注释中给出的信息来解决这个问题。我的解决方案在 s0me 案例中运行正确,但在很多案例中都提供了 TLE。
  • 您记住了您的解决方案吗?在二次时间内有一个 DP 解决方案
  • @thebenman 这个问题与背包不同,因为它不要求最大化没有。背包问题中的物品数量。注释中给出的要点也使这个问题变得更加困难。
  • @thebenman 既然您已经指出,我认为这个问题本可以由 DP 解决。为自己感到难过:(。

标签: algorithm backtracking


【解决方案1】:

我们称 x 为遵循该规则的元素。请注意,对于这组元素,我们有一些不错的属性:

  • 给定 x 按升序排序, sum(x[i..j])
  • 要解决最大和

获取此集合的一种方法是迭代按大小升序排序的项目并添加到集合中:

  • set 没有元素或
  • 当前元素 >= 2 * 大小[lastElementAdded] + 1

现在我们最多剩下 15 个不遵循此规则的项目。所以我们不能像以前那样使用有效的解决方案。对于每件物品,我们可以考虑是否将其放入包中。这导致 2^15 个可能的总和。对于这些总和中的每一个,我们可以对遵循规则的元素运行我们的方法。

总体复杂度:2^15 * (n - 15)。对于 n = 60,这应该在不到一秒的时间内解决。

作为一个练习:通过使用累加和二进制搜索,可以将其降低到 2^15 * log2(n - 15)。

【讨论】:

  • 很好的答案,还请告诉如何将遵守规则的项目与不遵守规则的项目分开。
  • @prakasht 添加:)
  • 我尝试应用公式“当前元素 >= 2 * size[lastElementAdded] + 1”,但我找不到在 x 集合中添加第一个元素的方法。请帮帮我。
  • @prakasht 不确定您的意思,第一个元素始终是尺寸最小的项目
  • 好吧,我的错,一旦我尝试运行一个示例,我就明白第一个元素将始终是尺寸最小的项目。感谢您的澄清,我只是一个初学者:p。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多