2
private final List<Set<Integer>> allSubsets = new ArrayList<>();4
public boolean canPartitionKSubsets(int[] nums, int k) {5
int sum = Arrays.stream(nums).sum();6
if (sum % k != 0) return false;7
getAllSubsets(nums.length, sum / k, new HashSet<>(), nums, false);8
return allSubsets.size() >= k9
&& canPartition(allSubsets.size(), k, nums.length, new HashSet<>());12
private boolean canPartition(int n, int k, int size, Set<Integer> current) {13
if (k == 0 && current.size() == size) return true;14
if (n == 0 || k < 0) return false;15
boolean addSet = false;16
if (allUnique(current, allSubsets.get(n - 1))) {17
current.addAll(allSubsets.get(n - 1));18
addSet = canPartition(n - 1, k - 1, size, current);19
current.removeAll(allSubsets.get(n - 1));21
return addSet || canPartition(n - 1, k, size, current);24
private void getAllSubsets(int n, int targetSum, Set<Integer> subsets, int[] nums, boolean lol) {26
allSubsets.add(new HashSet<>(subsets));29
if (n == 0 || targetSum < 0) return;31
getAllSubsets(n - 1, targetSum - nums[n - 1], subsets, nums, true);32
subsets.remove(n - 1);33
getAllSubsets(n - 1, targetSum, subsets, nums, false);36
private boolean allUnique(Set<Integer> set1, Set<Integer> set2) {37
for (Integer num : set1) if (set2.contains(num)) return false;