回溯算法,添加辅助变量记录回溯中产生子集的和,并将符合要求的子集加入结果。

import java.util.*;
public class Solution {
    ArrayList> res = new ArrayList();
    ArrayList track = new ArrayList(); //记录回溯过程中间结果
    int sum = 0; // 记录中间结果的和
    public ArrayList> combinationSum2(int[] num, int target) {
        Arrays.sort(num); //组合数字要求按照非递减排序,故先排序
        backtrack(0,num,target);
        return res;
    }
    private void backtrack(int start,int[] num,int target){
        if(sum == target){
            res.add(new ArrayList(track)); // 因为ArrayList为引用,需要重新new
            return;
        }
        if(sum > target){
            return; //剪枝
        }
        //回溯算法核心
        for(int i = start;i<num.length;i++){
            if(i>start && num[i] == num[i-1]){
                continue;
            }
            sum += num[i];
            track.add(num[i]);
            backtrack(i+1,num,target);
            sum -= num[i];
            track.remove(track.size()-1);
        }
    }
}