|
@@ -9,35 +9,29 @@ func canPartitionKSubsets(nums []int, k int) bool {
|
|
|
return false
|
|
|
}
|
|
|
sum /= k
|
|
|
- m := make(map[[3]int]none) // Use memorized search to avoid TLE
|
|
|
- return dfs(nums, k, sum, 0, 0, m)
|
|
|
+ sort.Sort(sort.Reverse(sort.IntSlice(nums))) // Sort the nums to avoid TLE (or use memorized search)
|
|
|
+ return dfs(nums, k, sum, 0, 0)
|
|
|
}
|
|
|
|
|
|
-func dfs(nums []int, k, sum, cur, set int, m map[[3]int]none) bool {
|
|
|
+func dfs(nums []int, k, sum, cur, set int) bool {
|
|
|
if k == 0 {
|
|
|
return set == 1<<uint(len(nums))-1
|
|
|
}
|
|
|
- if _, ok := m[[3]int{k, cur, set}]; ok {
|
|
|
- return false
|
|
|
- }
|
|
|
for i := range nums {
|
|
|
if set>>uint(i)&1 == 1 {
|
|
|
continue
|
|
|
}
|
|
|
- if t := cur + nums[i]; sum < t {
|
|
|
- continue
|
|
|
- } else if t < sum {
|
|
|
- nset := set | (1 << uint(i))
|
|
|
- if dfs(nums, k, sum, t, nset, m) {
|
|
|
- return true
|
|
|
- }
|
|
|
- m[[3]int{k, t, nset}] = none{}
|
|
|
- } else {
|
|
|
- nset := set | (1 << uint(i))
|
|
|
- if dfs(nums, k-1, sum, 0, nset, m) {
|
|
|
+ t := cur + nums[i]
|
|
|
+ if sum < t {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ nset := set | (1 << uint(i))
|
|
|
+ if t < sum {
|
|
|
+ if dfs(nums, k, sum, t, nset) {
|
|
|
return true
|
|
|
}
|
|
|
- m[[3]int{k, t, nset}] = none{}
|
|
|
+ } else if dfs(nums, k-1, sum, 0, nset) {
|
|
|
+ return true
|
|
|
}
|
|
|
}
|
|
|
return false
|