698.partition-to-k-equal-sum-subsets.go 705 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. type none struct{}
  2. func canPartitionKSubsets(nums []int, k int) bool {
  3. sum := 0
  4. for _, i := range nums {
  5. sum += i
  6. }
  7. if sum%k != 0 {
  8. return false
  9. }
  10. sum /= k
  11. sort.Sort(sort.Reverse(sort.IntSlice(nums))) // Sort the nums to avoid TLE (or use memorized search)
  12. return dfs(nums, k, sum, 0, 0)
  13. }
  14. func dfs(nums []int, k, sum, cur, set int) bool {
  15. if k == 0 {
  16. return set == 1<<uint(len(nums))-1
  17. }
  18. for i := range nums {
  19. if set>>uint(i)&1 == 1 {
  20. continue
  21. }
  22. t := cur + nums[i]
  23. if sum < t {
  24. break
  25. }
  26. nset := set | (1 << uint(i))
  27. if t < sum {
  28. if dfs(nums, k, sum, t, nset) {
  29. return true
  30. }
  31. } else if dfs(nums, k-1, sum, 0, nset) {
  32. return true
  33. }
  34. }
  35. return false
  36. }