377.combination-sum-iv.go 821 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. var empty struct{} = struct{}{}
  2. func combinationSum4(nums []int, target int) int {
  3. // res := make(map[string]struct{})
  4. // dfs(nums, target, []int{}, &res)
  5. // return len(res)
  6. n := len(nums)
  7. if n == 0 {
  8. return 0
  9. }
  10. sort.Ints(nums)
  11. dp := make([]int, target+1)
  12. dp[0] = 1
  13. for i := 1; i <= target; i++ {
  14. for _, val := range nums {
  15. if i < val {
  16. break
  17. }
  18. dp[i] += dp[i-val]
  19. }
  20. }
  21. return dp[target]
  22. }
  23. func dfs(nums []int, target int, pre []int, res *map[string]struct{}) {
  24. if target < 0 {
  25. return
  26. } else if target == 0 {
  27. (*res)[ints2str(pre)] = empty
  28. return
  29. }
  30. for _, i := range nums {
  31. dfs(nums, target-i, append(pre, i), res)
  32. }
  33. }
  34. func ints2str(nums []int) string {
  35. str := make([]string, len(nums))
  36. for i, v := range nums {
  37. str[i] = strconv.Itoa(v)
  38. }
  39. return strings.Join(str, ",")
  40. }