https://leetcode-cn.com/problems/partition-to-k-equal-sum-subsets/
这道题就是基本的dfs
遍历数组,然后找出满足和值的组合
但是遍历的时候,要注意,需要标注出哪些已经被用过。这里我采用list,通过remove和add(i,temp)(在特定的位置加入),来实现标记的作用。(应该采用标识的数组进行标记)
小技巧,防止超时:
排好序,并且从大到小开始遍历。如果是从小到大开始遍历,很容易出现小的在那里一直堆积,从而导致超时。
class Solution {
public boolean canPartitionKSubsets(int[] nums, int k) {
int max = 0;
int sum = 0;
List<Integer> list = new ArrayList<>();
for(int num : nums){
sum += num;
if(max < num){
max = num;
}
}
int target = sum / k;
if(sum%k!=0 || target < max) return false;
Arrays.sort(nums);
for(int i=nums.length-1;i>=0;i--){
list.add(nums[i]);
}
return dfs(list, target, k,0);
}
public static boolean dfs(List<Integer> list, int target, int count,int cur){
if(count==0) return true;
for(int i=0; i<list.size(); i++){
if(cur+list.get(i)==target){
int temp = list.remove(i);
if(dfs(list,target,count-1,0)){
return true;
}else{
list.add(i,temp);
}
}else if(cur+list.get(i)<target){
int temp = list.remove(i);
if(dfs(list,target,count,cur+temp)){
return true;
}else{
list.add(i,temp);
}
}
}
return false;
}
}