1. def backtrack(w: [], v: [], W, i) -> int:
  2. # base case
  3. if i == len(w):
  4. return 0
  5. else:
  6. if w[i] <= W:
  7. # 在root处理问题
  8. return max(
  9. v[i] + backtrack(w, v, W - w[i], i + 1),
  10. backtrack(w, v, W, i + 1))
  11. else:
  12. return backtrack(w, v, W, i + 1)
  13. def backtrack1(w: [], v: [], W, i, sum: int) -> int:
  14. # base case
  15. if i == len(w):
  16. # 在树叶处理, 需要使用一个变量维护, 从树根到叶子迭代, 比较和其它叶子的值。
  17. global maxsum
  18. if maxsum< sum:
  19. maxsum = sum
  20. return
  21. else:
  22. if w[i] <= W:
  23. # 在root处理问题
  24. backtrack1(w, v, W - w[i], i + 1, sum + v[i]),
  25. # 任何情况都可以选
  26. backtrack1(w, v, W, i + 1, sum)
  27. if __name__ == '__main__':
  28. W = 4
  29. w = [2, 1, 3]
  30. v = [4, 2, 3]
  31. print(backtrack(w, v, W, 0))
  32. maxsum = 0
  33. print(backtrack1(w, v, W, 0, 0), maxsum)
  34. # bp算法在顶层处理问题的解, 或者在底层处理

总结

  • 回溯是自顶向下的过程, 是一颗树的遍历过程
  • 问题的解可以在root处理, 也可以在叶子处理
    • 问题存在多解时候, 在叶子处理
    • 问题只有一个解时, 在root处理,减少不必要的参数传递