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