找出一个和为target的元素组合。元素可以重复使用
还是一样画出解空间树。这个和前面的区别就是选择列表少了很多,第二个数就不能选第一个数了,所以用一个begin可以标识出此时的列表 开始选择下标,这样在dfs的过程中传入了此时的i作为begin,也就是递归到下层时还是从此时的节点开始的,保证了选择列表中无法选择,而递归时可以选择。
还有就是此时的判断条件需要改变,因为现在不是到树的底部就结束,而是target到0结束,所以如果到了负数,则直接返回即可,因为再往下肯定大于target了。
class Solution {
List<List<Integer>> res =new ArrayList<List<Integer>>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
if(candidates.length==0){
return res;
}
List<Integer> path=new ArrayList<>();
core(candidates,target,0,path);
return res;
}
public void core(int[] candidates,int target,int begin,List<Integer> path){
if(target<0){
return;
}
if(target==0){
res.add(new ArrayList(path));
return;
}
for(int i=begin;i<candidates.length;i++){
path.add(candidates[i]);
core(candidates,target-candidates[i],i,path);
path.remove(path.size()-1);
}
}
}