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)