算法第五章作业

1.你对回溯算法的理解 

 回溯法一般都用在要给出多个可以实现最终条件的解的最终形式。回溯法要求对解要添加一些约束条件。总的来说,如果要解决一个回溯法的问题,通常要确定三个元素:

1、选择。对于每个特定的解,肯定是由一步步构建而来的,而每一步怎么构建,肯定都是有限个选择,要怎么选择,这个要知道;

同时,在编程时候要定下,优先或合法的每一步选择的顺序,一般是通过多个if或者for循环来排列。

2、条件。对于每个特定的解的某一步,他必然要符合某个解要求符合的条件,如果不符合条件,就要回溯,其实回溯也就是递归调用的返回。
3、结束。当到达一个特定结束条件时候,就认为这个一步步构建的解是符合要求的解了。把解存下来或者打印出来。

对于这一步来说,有时候也可以另外写一个issolution函数来进行判断。注意,当到达第三步后,有时候还需要构建一个数据结构,

把符合要求的解存起来,便于当得到所有解后,把解空间输出来。这个数据结构必须是全局的,作为参数之一传递给递归函数。

回溯法的优点在于其结构明确,可读性强,易于理解,而且通过对问题的分析可以大大提高运行效率。

常见解空间:

常见的解空间有子集树和排列树两种,当问题是从n个元素的集合S中找到满足某种性质的s的子集时,相应的

解空间为子集树,通常存在2n个叶结点。0-1背包的问题相应解空间即为子集树。当问题是确定n个元素的满足

某种性质的序列时,相应的解空间树为排列树通常有n!个叶结点。旅行售货问题的解空间即为排列树。

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

7-1 子集和问题 

设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。

//输入
5 10                
2 2 6 5 4
//输出
2 2 6         

if(sum + a[t] <= c)
{
x[t] = 1 ;
sum = sum+a[t] ;
if ( backtrack(t+1) )
return true;
sum -= a[t];
}
if( sum + rest >= c)
{
x[t] = 0 ;
if ( backtrack(t+1) )
return true;
}
rest += a[t];

约束函数:

当递归的层数大于等于n时,表示当前层次已经大于元素的个数,接下来的可以直接剪去以该节点的为根的子树即可

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

 主要的问题是剪枝方法和构建解空间树。结队编程更快的让我们构建解空间树,得到最佳的剪枝方法。

posted @ 2018-12-20 17:33  Archer丶kk  阅读(175)  评论(0编辑  收藏  举报