def backtrack(w: [], v: [], W, i) -> int: # base case if i == len(w): return 0 else: if w[i] <= W: # 在root处理问题 return max( v[i] + backtrack(w, v, W - w[i], i + 1), backtrack(w, v, W, i + 1)) else: return backtrack(w, v, W, i + 1)def backtrack1(w: [], v: [], W, i, sum: int) -> int: # base case if i == len(w): # 在树叶处理, 需要使用一个变量维护, 从树根到叶子迭代, 比较和其它叶子的值。 global maxsum if maxsum< sum: maxsum = sum return else: if w[i] <= W: # 在root处理问题 backtrack1(w, v, W - w[i], i + 1, sum + v[i]), # 任何情况都可以选 backtrack1(w, v, W, i + 1, sum)if __name__ == '__main__': W = 4 w = [2, 1, 3] v = [4, 2, 3] print(backtrack(w, v, W, 0)) maxsum = 0 print(backtrack1(w, v, W, 0, 0), maxsum)# bp算法在顶层处理问题的解, 或者在底层处理
总结
- 回溯是自顶向下的过程, 是一颗树的遍历过程
- 问题的解可以在root处理, 也可以在叶子处理
- 问题存在多解时候, 在叶子处理
- 问题只有一个解时, 在root处理,减少不必要的参数传递