#!/usr/bin/python# -*- coding: utf-8 -*-'''
Combination Sum.
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7] and target 7,
A solution set is:
[
[7],
[2, 2, 3]
]
'''classSolution(object):defcombinationSum(self, candidates, target):"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
length = len(candidates)
if length == 0:
return []
candidates.sort() #先排序
ret = []
tmp = []
self.__combinationSum(candidates,0,length,0,target,ret,tmp,0)
return ret
def__combinationSum(self,candidates,start,length,sum,target,ret,tmp,tmp_cur):if sum == target:
ret.append(tmp[:tmp_cur])
returnif start == length:
returnfor index,i in enumerate(candidates[start:]):
if sum + i > target:#如果当前比target大,后面的肯定比target大,因为是有序的break
tmp.append(i)
self.__combinationSum(candidates,index + start,length,sum + i,target,ret,tmp,tmp_cur + 1)
tmp.pop()
if __name__ == "__main__":
s = Solution()
print s.combinationSum([2, 3, 6, 7],7)