|
@@ -0,0 +1,44 @@
|
|
|
|
+type none struct{}
|
|
|
|
+
|
|
|
|
+func canPartitionKSubsets(nums []int, k int) bool {
|
|
|
|
+ sum := 0
|
|
|
|
+ for _, i := range nums {
|
|
|
|
+ sum += i
|
|
|
|
+ }
|
|
|
|
+ if sum%k != 0 {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ sum /= k
|
|
|
|
+ m := make(map[[3]int]none) // Use memorized search to avoid TLE
|
|
|
|
+ return dfs(nums, k, sum, 0, 0, m)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func dfs(nums []int, k, sum, cur, set int, m map[[3]int]none) 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) {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ m[[3]int{k, t, nset}] = none{}
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return false
|
|
|
|
+}
|