算法第五章作业

  1. 你对回溯算法的理解

  2. 请说明“子集和”问题的解空间结构和约束函数

  3. 请说明在本章学习过程中遇到的问题及结对编程的情况

 

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、遇到的问题与结对编程情况

  约束函数和剪枝总是设置的不够,很容易超时。

  结对编程情况,分工明确,合作良好!

你可能感兴趣的:(算法第五章作业)