package Backtrack
import (
"cmp"
"slices"
)
func combinationSum(candidates []int, target int) [][]int {
slices.SortFunc(candidates, func(a, b int) int {
return cmp.Compare(b, a)
})
size := len(candidates)
result := make([][]int, 0)
path := make([]int, 0)
pathSum := 0
var f func(i int)
f = func(i int) {
if i == size || pathSum > target {
return
}
if pathSum == target {
tmp := make([]int, len(path))
copy(tmp, path)
result = append(result, tmp)
return
}
// (1) 不选择当前元素
f(i + 1)
// (2) 选择一个当前元素
path = append(path, candidates[i])
pathSum += candidates[i]
f(i)
path = path[:len(path)-1]
pathSum -= candidates[i]
}
f(0)
return result
}