算法第五章小结

一、回溯算法的概念以及理解

  概念:回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。

  理解:在回溯法中,每次扩大当前部分解时,都面临一个可选的状态集合,新的部分解就通过在该集合中选择构造而成。这样的状态集合,其结构是一棵多叉树,每个树结点代表一个可能的部分解,它的儿子是在它的基础上生成的其他部分解。树根为初始状态,这样的状态集合称为状态空间树。

二、“子集和”问题的解空间结构和约束函数

  1、解空间结构

  非负非零的整数集合 S = {x1, x2, …, xn} 对应的一个子集 S1,S1 中的元素之和为 c 。

    2、约束函数

   if (sum + temp[t] <= c) 

   sum 是当前没有加上遍历到的那个值的总和,temp 数组是遍历的,c 是所要求的最优解(就是最大和)。

    如果大于该数,则舍去那个结点

   3.源代码

   

 1 #include <iostream>
 2 using namespace std;
 3 int n, c, d = 0, f = 0, k = 0;
 4 int a[10000], b[10000], e[10000],add[10000];
 5 
 6 void backtrack(int i)
 7 {
 8 if (i > n || f == 1) return;
 9 d += a[i];
10 b[i] = 1;
11 if (d != c)
12 {
13 if (d < c && (c - d < add[i])) backtrack(i + 1);
14 d -= a[i];
15 b[i] = 0;
16 backtrack(i + 1);
17 }
18 else
19 {
20 f = 1;
21 for (int j = 1; j <= i; j++)
22 if (b[j] == 1 && a[j] != 0) e[k++] = a[j];
23 }
24 }
25 
26 int main()
27 {
28 cin >> n >> c;
29 for (int i = 1; i <= n; i++)
30 cin >> a[i];
31 for (int j = n - 1; j >= 0; j--)
32 add[j] = add[j + 1] + a[j];
33 backtrack(1);
34 if (f == 0) cout << "No Solution!";
35 else
36 {
37 for (int i = 0; i < k; i++)
38 {
39 cout << e[i] << ' ';
40 }
41 }
42 system("pause");
43 return 0;
44 }

三、本章遇到的问题和结对编程的情况

1、遇到的问题

大概是上机实践的时候,对着第一题0-1背包一直在死磕,然后因为想不出怎样更好得约束函数,一直超时卡着,导致一道题没打出来。就觉得很难受吧!

2、结对编程的情况

两人一学期的编程思想交流,学到了挺多,毕竟不同人思维不同。然后大作业的也互相配合,分工合作才写出来的。

猜你喜欢

转载自www.cnblogs.com/zz010/p/12070895.html
今日推荐