把数组划分为k个子集,和相等
dfs就完事了,注意别重复搜索了,每次搜的时候从下一个数开始
int s = 0;
public boolean canPartitionKSubsets(int[] nums, int k) {
if (nums == null) return false;
if (nums.length < k) return false;
int sum = 0;
for (int x : nums) sum += x;
if (sum % k != 0) return false;
sum /= k;
s = sum;
boolean[] v = new boolean[nums.length];
int have = 0;
for (int i = 0; i < nums.length; i++) {
int x = nums[i];
if (x > sum) return false;
else if (x == sum) {
have++;
}
}
return dfs(v, nums, have, sum, 0);
}
boolean dfs(boolean[] v, int[] nums, int have, int partSum, int nextStart) {
if (have == v.length) {
return partSum == 0;
}
if (partSum == 0) {
return dfs(v, nums, have, s, 0);
}
boolean succ = false;
for (int i = nextStart; i < nums.length; i++) {
if (v[i]) continue;
v[i] = true;
succ |= dfs(v, nums, have + 1, partSum - nums[i], i + 1);
v[i] = false;
if (succ) return true;
}
return succ;
}