class Solution {
public boolean canPartitionKSubsets(int[] nums, int k) {
int total = 0;
for (int num : nums) total += num;
if (total % k != 0) return false;
int sum = total / k;
int[] sums = new int[k];
return dfs(nums, 0, sum, k, sums);
}
private boolean dfs(int[] nums, int index, int sum, int k, int[] sums) {
if (index == nums.length) {
for (int i = 0; i < k; i++) {
if (sums[i] != sum) {
return false;
}
}
return true;
}
for (int i = 0; i < k; i++) {
if (sums[i] + nums[index] <= sum) {
sums[i] += nums[index];
//if we can fill all buckets then return true
if (dfs(nums, index + 1, sum, k, sums)) return true;
//means we can't fill other buckets if we take ith element
// so leave this element
sums[i] -= nums[index];
}
// *********************IMPORTANT***********************
if (sums[i] == 0) break;
// *********************IMPORTANT***********************
}
return false;
}
}