[1,1,2,5,6,7,10]
基本分四种情况:
数本身可不可以重复用, 由 traceback(...,i ,..) 还是 traceback(...,i+1 ,..) 决定
答案可不可以重复, 由if (i>startInd && a[i]==a[i-1]) continue; 决定
拿 39 Combination Sum 和 40 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]]