'''
39. 组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ，找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明：
所有数字（包括 target）都是正整数。
解集不能包含重复的组合。
示例 1：
输入：candidates = [2,3,6,7], target = 7,
所求解集为：
[
  [7],
  [2,2,3]
]
示例 2：
输入：candidates = [2,3,5], target = 8,
所求解集为：
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]
提示：
1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每个元素都是独一无二的。
1 <= target <= 500
'''
import copy
class Solution(object):
    def combinationSum(self, candidates, target):
        res = []
        current = []
        self.dfs(res,current,candidates,target)
        return res

    def dfs(self,res,current,can,target):
        if target==0:
            temp = copy.deepcopy(current)
            res.append(temp)
            return
        for i in range(len(can)):
            if target>=can[i]:
                current.append(can[i])
                self.dfs(res,current,can[i:],target-can[i])
                current.pop()


if __name__ == '__main__':
    s = [2,3,6,7]
    t = 7
    a = Solution()
    RES = a.combinationSum(s,t)
    print(RES)