给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1: 输入: candidates = [10,1,2,7,6,1,5], target = 8, 输出: [ [1,1,6], [1,2,5], [1,7], [2,6] ] 示例 2: 输入: candidates = [2,5,2,1,2], target = 5, 输出: [ [1,2,2], [5] ] 提示: 1 <= candidates.length <= 100 1 <= candidates[i] <= 50 1 <= target <= 30
import traceback
class Solution:
def combination_total(self, candidates, targetSum, res, startindex, path=[]):
length = len(path)
if sum(path) == targetSum:
res.append(path[:])
# 回溯,寻找下一组
return
for i in range(startindex, len(candidates)):
# 剪枝,若加入当前元素candidates[i] > targetSum,则不对candidates[i]进行操作
if sum(path) + candidates[i] > targetSum:
# 排过序了,后序元素更大,直接不再遍历
break
# 对同一层级使用过的元素进行跳过
if i > startindex and candidates[i] == candidates[i - 1]:
continue
path.append(candidates[i])
self.combination_total(candidates, targetSum, res, i + 1, path)
# 回溯
path.pop()
if __name__ == '__main__':
try:
# candidates = list(map(int, input().split(',')))
candidates = eval(input())
candidates.sort()
targetSum = int(input())
res = []
solution = Solution()
solution.combination_total(candidates, targetSum, res, 0)
print(res)
except Exception as e:
traceback.print_exc()
仅作为代码记录,方便自学自查自纠