【问题标题】:Brute force implementation for 0-1 Knapsack0-1背包的蛮力实施
【发布时间】:2011-12-18 18:41:44
【问题描述】:

我在给定任务上苦苦挣扎了将近一个星期,但没有成功找到解决方案,所以这个网站是我最后的希望。

我有0-1 Knapsack 问题,它有 20 个具有不同值和重量的物品,麻袋的最大重量是 524。现在我需要实施蛮力来找到 20 个物品的最佳解决方案子集,以便总重量

能否请您指出我或更好地给出详细的实现来分析它是如何工作的! 非常感谢

【问题讨论】:

  • 是的,这是作业,我不知道如何找到所有可能的组合,我应该将组合存储到数组中吗?

标签: c algorithm knapsack-problem


【解决方案1】:

蛮力的想法很简单:

  1. 生成 20 个项目的所有可能子集,仅保存满足您的重量限制的那些。如果您想花哨,您甚至可以只考虑在不违反权重约束的情况下无法添加任何其他内容的子集,因为只有这些可能是正确的答案。 O(2^n)
  2. 找到权重最大的子集。就候选者的数量而言是线性的,因为我们有 O(2^n) 个候选者,所以这是 O(2^n)。

如果您想要一些伪代码,请发表评论。

编辑:嘿,这是伪代码以防万一。

  GetCandidateSubsets(items[1..N], buffer, maxw)
  1. addedSomething = false
  2. for i = 1 to N do
  3.    if not buffer.contains(item[i]) and
           weight(buffer) + weight(items[i]) <= maxw then
  4.       add items[i] to buffer
  5.       GetCandidateSubsets(items[1..N], buffer)
  6.       remove items[i] from buffer
  7.       addedSomething = true
  8. if not addedSomething then
  9.    emit & store buffer

请注意,GetCandidateSubsets 函数效率不高,即使是蛮力实现也是如此。感谢阿米特指出这一点。您可以将其重新设计为仅遍历项目集的组合,而不是排列,作为第一次优化。

  GetMaximalCandidate(candidates[1..M])
  1. if M = 0 then return Null
  2. else then
  3.    maxel = candidates[1]
  4.    for i = 2 to M do
  5.       if weight(candidates[i]) > weight(maxel) then
  6.          maxel = candidates[i]
  7.    return maxel

【讨论】:

  • (1) 找到最大权重也是O(2^n),因为您需要检查所有子集。 (2)回溯和蛮力的主要优势通常是空间复杂度,通过存储所有可能性,你的空间复杂度是O(2^n),你就失去了这个优势。 (3) 你的伪代码中的解决方案不是O(2^n),而是O(n!),甚至是O(n^n)
  • @amit:对,获得最大元素将是 O(2^n),因为要检查 O(2^n) 个子集,并且最大元素查找代码会查看它们。第二个批评对我来说并不是那么有意义,因为 OP 并没有真正表明这是一个问题。注意到(3)中的批评;对于它的价值,我并没有在这段代码中投入很多工作。
  • 请注意,如果子集 A 有 1000 个值和 523 个权重,而 B 有 999 个值和 524 个权重,则 A 必须是最优解
  • @FinalIllusion:是的,没错。即使伪代码不知何故没有得到正确的答案,第 1 点和第 2 点中概述的方法显然是解决问题的可靠方法。如果我的 GetCandidateSubsets 效率低下,或者正如您所建议的那样不正确,请在 StackOverflow 中搜索 any 函数以从一组元素中生成子集。他们中的任何一个都可以。根据权重限制丢弃不“满”的子集只是减少候选子集空间的优化。
  • @Patrick87:谢谢你的伪代码!能否请您在c中详细编写实现。我想我学的比伪代码更多
猜你喜欢
  • 1970-01-01
  • 2015-06-22
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多