1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution { public boolean canPartitionKSubsets(int[] nums, int k) { int sum = Arrays.stream(nums).sum(); if (sum % k != 0) { return false; }
int targetSum = sum / k; Arrays.sort(nums); boolean[] used = new boolean[nums.length]; return dfs(nums, used, nums.length - 1, 0, targetSum, k); }
private boolean dfs(int[] nums, boolean[] used, int startIndex, int sum, int targetSum, int k) { if (k == 1) { return true; }
if (sum == targetSum) { return dfs(nums, used, nums.length - 1, 0, targetSum, k - 1); }
for (int i = startIndex; i >= 0; i--) { if (used[i] || sum + nums[i] > targetSum || (i + 1 < nums.length && !used[i + 1] && nums[i] == nums[i + 1])) { continue; }
used[i] = true; if (dfs(nums, used, i - 1, sum + nums[i], targetSum, k)) { return true; } used[i] = false; }
return false; } }
|