用一个例题来说明一下:
代码如下:
测试案例如:candidates[1,2,3,4] , taeget =5;
1.创建一维int型容器path; //用来存放符合条件的单个数组
2.给int型sum初始化为1; //sum用来存放数值之和
3.创建二维int型容器result; //存放满足条件的总结果
4.调用backtracking函数 ①
5.不满足if1 ②
6.不满足if2 ③
7.进入for循环 ④ i=0
8. sum=1
9.path=【1】
10.执行①
11.②
12.③
13. ④ i=0
14.sum=2
15.path=【1,1】
16.执行①②③④ i=0
17.sum=3
18.path = 【1,1,1】
19.执行①②③④ i=0
20.sum=4
21.path = 【1,1,1,1】
22.执行①②③④ i=0
23.sum = 5
24.path=【1,1,1,1,1,】
25.执行①
26.②依旧不满足条件
27.③满足条件 result=【【1,1,1,1,1】】 结束此次循环
28.跳转到上次执行的④的下面(这里是因为递归,栈中会保留此函数)执行sum-=candidates【0】 sum=4
29.path=【1,1,1,1】
30.执行for循环 i=1
31.sum=6
32.path=【1,1,1,1,2】
33.执行④
34.sum>target 终止此次循环,跳转到sum-=
35.sum=4
36.path=【1,1,1,1】
37.执行for循环 i=2
38.sum=7;
39.path=【1,1,1,1,3】
40.sum>target 终止此次循环,跳转到sum-=
41.sum=4
42.path=【1,1,1,1】
43.执行for循环 i=3
44.sum=8
45.path=【1,1,1,1,4】
46.执行④
47.sum>target 终止此次循环,跳转到sum-=
48.sum=4
49.path=【1,1,1,1】
50.这时候i=4,没有办法执行for循环了,返回上一级backtacking函数,这就是递归与回溯,跳转到22行backtacking函数下方的sum-=处
51.sum=3
52.path=【1,1,1,】
53.执行for循环 i=1
54.sum=5
55.path=【1,1,1,2】
56.执行④
57.不满足①
58.满足② sum=target result=【【1,1,1,1,1】,【1,1,1,2】 ,终止此次循环,跳转到sum-=
59.sum=3
60.path=【1,1,1】
61.下面就是一些重复过程,因为皆不满足条件1
62.执行完所有的for循环后,i=4,结束循环,跳转到19行的下方sum-=
接下来的重复过程就不在详述了,为了更好地理解回溯算法,这里就没有写剪枝的代码。
path数组变换过程如下:
1 1 1 1 1
1 1 1 1 2
1 1 1 1 3
1 1 1 1 4
1 1 1 2
1 1 1 2 2
1 1 1 2 3
1 1 1 2 4
1 1 2 2
1 1 2 3
1 1 2 4
1 1 3
1 1 3 3
1 1 3 4
1 1 4
1 1 4 4
1 2
1 2 2
1 2 3
1 2 4
1 3
1 3 3
1 3 4
1 4
1 4 4
2
2 2
2 3
2 4
3 3
3 4
4
4 4
点赞支持哦!~