0-1背包的蛮力实施

时间:2011-10-31 14:04:01

标签: c algorithm knapsack-problem

我正在努力完成给定的任务近一周而没有成功找到解决方案,所以这个网站是我最后的希望。

我有0-1 Knapsack个问题,其中有20个项目具有不同的值和权重,最大重量是524.现在我需要实施蛮力来找到20个项目的最佳解决方案子集,以便总重量<= 524和所选项目的最大值。

请您指出或更好地详细说明如何运作!! 非常感谢你

1 个答案:

答案 0 :(得分:6)

蛮力的想法很简单:

  1. 生成20个项目的所有可能子集,仅保存满足您的权重约束的项目。如果你想要花哨,你甚至可以只考虑你不能在不违反权重约束的情况下添加任何其他内容的子集,因为只有这些可能是正确的答案。 O(2 ^ n)的
  2. 查找具有最大权重的子集。候选人数是线性的,因为我们有O(2 ^ n)个候选者,所以这是O(2 ^ n)。
  3. 如果你想要一些伪代码,请评论。

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

      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函数效率不高,即使对于强力实现也是如此。感谢amit指出这一点。您可以将其重新设计为仅将项目集的组合(而不是排列)作为首次优化进行处理。

      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