Code
def combinationSum(candidates, target):
result = []
def dfs(remain, combo, start):
if remain == 0:
result.append(combo)
return
elif remain < 0:
return
for i in range(start, len(candidates)):
dfs(remain-candidates[i], combo+[candidates[i]], i)
dfs(target, [], 0)
return result
# example test case
candidates = [2, 3, 6, 7]
target = 7
result = combinationSum(candidates, target)
print(result)