一、回溯算法的概念以及理解
概念:回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。
理解:在回溯法中,每次扩大当前部分解时,都面临一个可选的状态集合,新的部分解就通过在该集合中选择构造而成。这样的状态集合,其结构是一棵多叉树,每个树结点代表一个可能的部分解,它的儿子是在它的基础上生成的其他部分解。树根为初始状态,这样的状态集合称为状态空间树。
二、“子集和”问题的解空间结构和约束函数
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、结对编程的情况
两人一学期的编程思想交流,学到了挺多,毕竟不同人思维不同。然后大作业的也互相配合,分工合作才写出来的。
原文地址:https://www.cnblogs.com/zz010/p/12070895.html
时间: 2024-10-30 02:31:55