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
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) bool {
if k == 0 {
return set == 1<<uint(len(nums))-1
}
for i := range nums {
if set>>uint(i)&1 == 1 {
continue
}
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
}
} else if dfs(nums, k-1, sum, 0, nset) {
return true
}
}
return false
}