'''
解题思路:
1、使用DFS+回溯求解组合问题,dfs(iStart,res),其中iStart为搜索起点,res保存搜索路径,
2、持续搜索约束条件为当前路径和 num[i]+s 小于等于80,达到目标值时保存搜索路径
3、先排序,组合搜索范围 for i in range(iStart,n),利用i>iStart and num[i]==num[i-1]条件,去除重复搜索(i-1的搜索结果,必然包含i的结果)
4、dfs(i+1,res+[num[i]]) ,采用 res+[num[i]] 传参数自动回溯
'''
# @param num int整型一维数组
# @param target int整型
# @return int整型二维数组
#
class Solution:
def combinationSum2(self , num , target ):
# write code here
n = len(num)
num = sorted(num)
#print(num)
iStart = 0
res = []
out = []
def dfs(iStart,res):
s = sum(res) # 路径和
if s>target:
return
if s==target:
if res not in out: # 这里也可以去重
out.append(res) # 保存路径
return # 返回空回溯
for i in range(iStart,n):
dfs(i+1,res+[num[i]]) # i+1,增加路径
dfs(iStart,res)
#print(out)
return out
#Solution().combinationSum2([100,10,20,70,60,10,50],80) # [[10,10,60],[10,20,50],[10,70],[20,60]]
'''
def dfs(iStart,res):
s = sum(res) # 路径和
if s==target:
if res not in out: # 这里也可以去重
out.append(res) # 保存路径
return # 返回空回溯
for i in range(iStart,n):
if i>iStart and num[i]==num[i-1]: # 去除重复搜索(i-1的搜索结果,必然包含i的结果)
continue
if num[i]+s <= target: # 持续搜索约束条件为当前路径和 num[i]+s 小于等于80
dfs(i+1,res+[num[i]]) # i+1,增加路径
'''