416.partition-equal-subset-sum.go 657 B

123456789101112131415161718192021222324252627282930
  1. type ints []int
  2. func (is ints) Len() int { return len(is) }
  3. func (is ints) Less(i, j int) bool { return is[j] < is[i] }
  4. func (is ints) Swap(i, j int) { is[i], is[j] = is[j], is[i] }
  5. func canPartition(nums []int) (ans bool) {
  6. sum := 0
  7. for _, i := range nums {
  8. sum += i
  9. }
  10. if sum&1 == 1 {
  11. return false
  12. }
  13. sort.Sort(ints(nums))
  14. dfs(nums, len(nums), sum/2, 0, 0, 0, &ans)
  15. return
  16. }
  17. func dfs(nums []int, n, sum, i, p1, p2 int, ans *bool) {
  18. if *ans == true || sum < p1 || sum < p2 {
  19. return
  20. } else if i == n {
  21. *ans = p1 == p2
  22. return
  23. }
  24. dfs(nums, n, sum, i+1, p1+nums[i], p2, ans)
  25. dfs(nums, n, sum, i+1, p1, p2+nums[i], ans)
  26. }