classSolution{publicList<List<Integer>>combinationSum(int[] candidates,int target){backtracking(candidates,target,0);return result;}List<List<Integer>> result =newArrayList();List<Integer> paths =newArrayList();int sum =0;publicvoidbacktracking(int[] candidates,int target,int startIndex){if(target==sum){
result.add(newArrayList(paths));return;}if(sum>target){return;}for(int i = startIndex;i<candidates.length;i++){
paths.add(candidates[i]);
sum += candidates[i];backtracking(candidates,target,i);
sum -= candidates[i];
paths.remove(paths.size()-1);}}}
classSolution{publicList<List<Integer>>combinationSum2(int[] candidates,int target){Arrays.sort(candidates);
used =newboolean[candidates.length];backtracking(candidates,target,0);return result;}List<List<Integer>> result =newArrayList();List<Integer> paths =newArrayList();boolean[] used;int sum =0;publicvoidbacktracking(int[] candidates,int target,int startIndex){if(sum>target){return;}if(sum==target){
result.add(newArrayList(paths));return;}for(int i = startIndex;i<candidates.length;i++){if(i>0&&candidates[i]==candidates[i-1]&&!used[i-1]){continue;}
sum += candidates[i];
used[i]=true;
paths.add(candidates[i]);backtracking(candidates,target,i+1);
paths.remove(paths.size()-1);
used[i]=false;
sum -= candidates[i];}}}