博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法第5章作业
阅读量:5263 次
发布时间:2019-06-14

本文共 1021 字,大约阅读时间需要 3 分钟。

1.你对回溯算法的理解(2分)

  回溯法是一个既带有系统性又带有跳跃性的搜索算法。它在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间的任一结点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先策略搜索。回溯法求问题的所有解时,要回溯到跟,且根结点的所有子树都已被搜索遍才结束。求问题的一个解时,只要搜索到问题的一个解就可结束。

  基本步骤:

    (1)用回溯法解问题时,应明确定义问题的解空间。解空间至少应包含问题的一个(最优)解。

    (2)将解空间组织成树或图的形式

    (3)以深度优先方式搜索整个解空间,并在搜索过程中用剪枝函数避免无效搜索。

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

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

  

  解空间:是否选择当前元素。

  约束函数:保证  sum+a[t]<=c。(a[ t ]为当前元素值,sum为该元素前的子集和)

bool backtrack(int t){    if (sum==c)         return true;    if (t>=n)        return false;    rest-=a[t];    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];    return false;}

 

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

  实践过程中,发现我们对剪枝函数的理解并不透彻,什么时候使用剪枝函数,不是很了解,请教了同学后才明白。

转载于:https://www.cnblogs.com/lasia/p/10164139.html

你可能感兴趣的文章
Java大数——a^b + b^a
查看>>
简单的数据库操作
查看>>
帧的最小长度 CSMA/CD
查看>>
树状数组及其他特别简单的扩展
查看>>
普通求素数和线性筛素数
查看>>
PHP截取中英文混合字符
查看>>
【洛谷P1816 忠诚】线段树
查看>>
电子眼抓拍大解密
查看>>
tomcat7的数据库连接池tomcatjdbc的25个优势
查看>>
Html 小插件5 百度搜索代码2
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
java 常用命令
查看>>
卷积中的参数
查看>>
51nod1076 (边双连通)
查看>>
ViewPager的onPageChangeListener里面的一些方法参数:
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
2019春 软件工程实践 助教总结
查看>>
Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
查看>>