如何摆脱背包的蛮力?

时间:2021-03-22 02:22:52

标签: python knapsack-problem brute-force

我一直在为即将到来的考试研究动态编程的一些问题,背包似乎是开发基本级别可理解的解决方案的一个很好的切入点。

我有一个可以生成答案但效率不高的解决方案,因为运行时间太高,我该如何实现递归?

  return knapsack_recursive(profits, weights, capacity, 0)


def knapsack_recursive(profits, weights, capacity, currentIndex):
  if capacity <= 0 or currentIndex >= len(profits):
    return 0

  profit1 = 0
  if weights[currentIndex] <= capacity:
    profit1 = profits[currentIndex] + knapsack_recursive(
      profits, weights, capacity - weights[currentIndex], currentIndex + 1)

  profit2 = knapsack_recursive(profits, weights, capacity, currentIndex + 1)

  return max(profit1, profit2)


def main():
  print(solve_knapsack([1, 6, 10, 16], [1, 2, 3, 5], 7))
  print(solve_knapsack([1, 6, 10, 16], [1, 2, 3, 5], 6))


main()

1 个答案:

答案 0 :(得分:0)

根据维基百科:“背包问题的决策问题形式(是否可以在不超过重量 W 的情况下实现至少为 V 的值?)是 NP 完全的,因此没有已知的算法既正确又快速(多项式-time)在所有情况下。”

因此,不存在保证在可处理的时间内找到最佳解决方案的算法。超过一定规模,以目前的计算能力是做不到的。

但是,可以使用启发式方法找到好的解决方案:一个可以使用的好策略,例如选择每单位重量最有价值的物品,首先从最大的物品开始,然后用较小的物品填补空白。

由于这个问题已经被广泛研究,你会发现很多不同算法的论文。

除非你被明确要求提出一个递归算法只是为了它。