https://discuss.leetcode.com/topic/46161/a-general-approach-to-backtracking-questions-in-java-subsets-permutations-combination-sum-palindrome-partitioning

[1,1,2,5,6,7,10]

基本分四种情况:

数本身可不可以重复用, 由 traceback(...,i ,..) 还是 traceback(...,i+1 ,..) 决定

答案可不可以重复, 由if (i>startInd && a[i]==a[i-1]) continue; 决定

39 Combination Sum40 Combination Sum II 来举例子

情况1 : 每个数可以用无数次,答案允许重复

for (int i=startInd;i<a.length;i++){
    temp.add(a[i]);
    traceback(a,res,temp,i,sum+a[i],target);
    temp.remove(temp.size()-1);
}

情况1 结果

[[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,2],
[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,2],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,2],[1,1,1,1,2,2],
[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,2],[1,1,1,1,2,2],[1,1,1,5],[1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,2],[1,1,1,1,2,2],[1,1,1,5],[1,1,2,2,2],[1,1,6],[1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,2],[1,1,1,1,2,2],[1,1,1,5],[1,1,2,2,2],[1,1,6],[1,2,5],[1,7],[1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,2],[1,1,1,1,2,2],[1,1,1,5],[1,1,2,2,2],[1,1,6],[1,2,5],[1,7],[2,2,2,2],[2,6]]

情况2 : 每个数可以用无数次,答案不允许重复

for (int i=startInd;i<a.length;i++){
    if (i>startInd && a[i]==a[i-1]) continue;
    temp.add(a[i]);
    traceback(a,res,temp,i,sum+a[i],target);
    temp.remove(temp.size()-1);
}

情况2 结果

[[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,2],[1,1,1,1,2,2],[1,1,1,5],[1,1,2,2,2],
[1,1,6],[1,2,5],[1,7],[2,2,2,2],[2,6]]

情况3: 每个数只能用一次,答案允许重复

for (int i=startInd;i<a.length;i++){
    temp.add(a[i]);
    traceback(a,res,temp,i+1,sum+a[i],target);
    temp.remove(temp.size()-1);
}

情况3 结果

[[1,1,6],[1,2,5],[1,7],[1,2,5],[1,7],[2,6]]

情况4: 每个数只能用一次,答案不允许重复

for (int i=startInd;i<a.length;i++){
    if (i>startInd && a[i]==a[i-1]) continue;
    temp.add(a[i]);
    traceback(a,res,temp,i+1,sum+a[i],target);
    temp.remove(temp.size()-1);
}

情况4 结果

[[1,1,6],[1,2,5],[1,7],[2,6]]

results matching ""

    No results matching ""