1234567891011121314151617181920212223242526272829303132333435363738 |
- 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
- }
|