import java.util.*;
public class Main {
static int[] nums = new int[15];
static int sum = 0;
static int tmpSum = 0;
static int ans = Integer.MAX_VALUE;
static LinkedList<Integer> tmp = new LinkedList<>();
public static void main(String[] args) {
nums = new int[3];
Scanner scan = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
// 最后都是2个零,可以先去掉
nums[i] = scan.nextInt();
sum += nums[i];
}
dfs(0);
}
static void dfs(int start) {
if (tmp.size() >= 1) {
System.out.println(tmp);
}
if (tmp.size() > 9) {
return;
}
for (int i = start; i < nums.length; i++) {
tmpSum += nums[i];
tmp.add(nums[i]);
dfs(i + 1);
// 回溯
tmp.removeLast();
tmpSum -= nums[i];
}
}
}
上面的代码就是正常的找组合、找子集。
如果把dfs回溯的代码改成start + 1,会有什么不同?
区别在哪里??
1、12、123、13前面都是一样的,后面就不同了,i + 1是2,start + 1是133,这是因为 for (int i = start; i < n; i++) 中,i是在变化的,但是start没有变化。
例如,for (int i = 2; i < 4; i++),dfs(3)回溯回来,tmp.removeLast(),再i++,for循环中此时的 i = 3,如果是dfs(i + 1),则会跳到dfs(4),如果是dfs(start + 1),因为i++,与for循环中int i = start的start是不同的,start是不变的,所以还是dfs(3),所以结果上才会有多次取同一个数的情况。
之前偶然写dfs写错,把i+1写成start+1,发现输出结果很奇怪,就想搞懂里面的逻辑,分析之后通畅多了。