回溯模板,res,path,index递归;由于可重复,所以每次回溯时用i而不是i+1
func combinationSum(candidates []int, target int) [][]int {
var res [][]int
var path []int
var sum int
var backtrack func(index int)
backtrack = func(index int) {
if sum > target {
return
}
if sum == target {
tmp := make([]int, len(path))
copy(tmp, path)
res = append(res, tmp)
return
}
for i := index; i < len(candidates); i++ {
path = append(path, candidates[i])
sum += candidates[i]
backtrack(i)
sum -= candidates[i]
path = path[:len(path)-1]
}
}
backtrack(0)
return res
}