func combinationSum(candidates []int, target int) [][]int {
ans := [][]int{}
dfs(candidates, target, 0, []int{}, &ans, 0)
return ans
}
func dfs(candidates []int, target int, sum int, curs []int, ans *[][]int, base int) {
if sum > target {
return
}
if sum == target {
*ans = append(*ans, append([]int{}, curs...))
return
}
for i := base; i < len(candidates); i ++ {
curs = append(curs, candidates[i])
dfs(candidates, target, sum + candidates[i], curs, ans, i)
curs = curs[:len(curs) - 1]
}
}