算法第五章作业
-
你对回溯算法的理解
-
请说明“子集和”问题的解空间结构和约束函数
-
请说明在本章学习过程中遇到的问题及结对编程的情况
1.对回溯法的理解
定义:以深度优先方式(DFS)系统搜索问题解的算法称为回溯法
优势:被称为“通用的解题法”(就是没有思路的时候就用这个算法就行了)而且也适合组合数较大的问题
思路:① 针对问题定义解空间 ② 确定易于搜索的解空间结构(通常将解空间组织成树或图) ③ 在问题的解空间树中,按DFS从根开始出发搜索树,每到一个结点就要判断该结点下是否包含问题解,如果不包含就回溯(不往下找了)否则就往下
能力:可以系统地搜索一个问题的所有解(需要遍历所有的子树才结束)或任一解(找到解就退出)
约束&限界:在搜索解空间树的时候,约束函数在扩展结点处剪去不满足约束的子树;限界函数(即剪枝函数)剪去得不到最优解的子树
种类:子集树和排列树
子集树的通用框架(背包问题,但不限于两个分支)
1 void backtrack(int t) 2 3 { 4 if(t>n) 5 output(x); 6 else 7 for(int i=0; i<=1; i++) //注意,这里的0,1 是X[i]的取值范围,t表示层数 8 { 9 x[t] = i; 10 if(constraint(t) && bound(t)) 11 backtrack(t+1); 12 } 13 }
排列树的通用框架(旅行售货员问题)
1 void backtrack(int t) 2 3 { 4 if(t>n) 5 6 output(x); 7 else 8 9 for(int i=t; i<=n; i++) //这里的n表示层数,不要和子集树搞混了 10 { 11 swap(x[t], x[i]); 12 if(constraint(t) && bound(t)) backtrack(t+1); 13 swap(x[t], x[i]); 14 15 } 16 17 }
2、“子集和”问题的解空间结构和约束函数
“子集和”问题的解空间结构是一棵集合树,约束函数是根据当前的扩展结点的值与答案的值相比较
3、遇到的问题与结对编程情况
约束函数和剪枝总是设置的不够,很容易超时。
结对编程情况,分工明确,合作良好!