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

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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. m := make(map[[3]int]none) // Use memorized search to avoid TLE
  12. return dfs(nums, k, sum, 0, 0, m)
  13. }
  14. func dfs(nums []int, k, sum, cur, set int, m map[[3]int]none) bool {
  15. if k == 0 {
  16. return set == 1<<uint(len(nums))-1
  17. }
  18. if _, ok := m[[3]int{k, cur, set}]; ok {
  19. return false
  20. }
  21. for i := range nums {
  22. if set>>uint(i)&1 == 1 {
  23. continue
  24. }
  25. if t := cur + nums[i]; sum < t {
  26. continue
  27. } else if t < sum {
  28. nset := set | (1 << uint(i))
  29. if dfs(nums, k, sum, t, nset, m) {
  30. return true
  31. }
  32. m[[3]int{k, t, nset}] = none{}
  33. } else {
  34. nset := set | (1 << uint(i))
  35. if dfs(nums, k-1, sum, 0, nset, m) {
  36. return true
  37. }
  38. m[[3]int{k, t, nset}] = none{}
  39. }
  40. }
  41. return false
  42. }