题目定位
这题的关键是递归中保留起始索引,从而避免排列式重复,同时又允许当前数字被重复使用。
关键观察
因为允许重复使用,所以当前索引可以再次选择;但一旦往后走,就不该再回到更早索引。
目标复杂度
Exponential / O(target)
这题的解法思路怎么拆
1
这题的关键是递归中保留起始索引,从而避免排列式重复,同时又允许当前数字被重复使用。
2
因为允许重复使用,所以当前索引可以再次选择;但一旦往后走,就不该再回到更早索引。
3
先把决策树结构建出来。
4
确定当前层候选集怎么生成。
参考实现
Python# Generic pattern template
def backtrack(path):
if complete(path):
answer.append(path[:])
return
for choice in choices(path):
if not valid(choice, path):
continue
path.append(choice)
backtrack(path)
path.pop()
常见坑点
warning
明明允许重复使用,却把 start 索引提前加一。
warning
剩余目标已经为负时还继续递归。
高频追问
Combination Sum II 的区别是什么?
为什么排序有利于这题剪枝?
继续刷相关题
先把 回溯 这个模式刷成体系,再去做更难变体。