实验6子集和问题的回溯算法设计与实现报告.docx
- 文档编号:23451269
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:11
- 大小:60.76KB
实验6子集和问题的回溯算法设计与实现报告.docx
《实验6子集和问题的回溯算法设计与实现报告.docx》由会员分享,可在线阅读,更多相关《实验6子集和问题的回溯算法设计与实现报告.docx(11页珍藏版)》请在冰豆网上搜索。
实验6子集和问题的回溯算法设计与实现报告
实验6子集和问题的回溯算法设计与实现
一、实验目的
1、掌握回溯法解题的基本思想;
2、掌握回溯算法的设计方法;
3、针对子集和数问题,熟练掌握回溯递归算法、迭代算法的设计与实现。
二、实验内容
1、认真阅读教材或参考书,掌握回溯法解题的基本思想,算法的抽象控制策略;
2、了解子集和数问题及解向量的定长和变长状态空间表示;
3、针对解向量的定长表示,设计状态空间树节点扩展的规范(限界)函数及实现方法;
4、分析深度优先扩展状态空间树节点或回溯的条件;
5、分析和设计生成解向量各分量可选值的实现方法;
6、设计和编制回溯算法的递归和迭代程序。
【实验题】:
组合数问题:
找出从自然数1,2,…,n中任取r个数的所有组合。
3、算法的原理方法
回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。
当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。
如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。
在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。
扩大当前候选解的规模,以继续试探的过程称为向前试探。
可以采用回溯法找问题的解,将找到的组合以从小到大顺序存于a[0],a[1],…,a[r-1]中,组合的元素满足以下性质:
(1) a[i+1]>a[i],后一个数字比前一个大;
(2) a[i]-i<=n-r+1。
按回溯法的思想,找解过程可以叙述如下:
首先放弃组合数个数为r的条件,候选组合从只有一个数字1开始。
因该候选解满足除问题规模之外的全部条件,扩大其规模,并使其满足上述条件
(1),候选组合改为1,2。
继续这一过程,得到候选组合1,2,3。
该候选解满足包括问题规模在内的全部条件,因而是一个解。
在该解的基础上,选下一个候选解,因a[2]上的3调整为4,以及以后调整为5都满足问题的全部要求,得到解1,2,4和1,2,5。
由于对5不能再作调整,就要从a[2]回溯到a[1],这时,a[1]=2,可以调整为3,并向前试探,得到解1,3,4。
重复上述向前试探和向后回溯,直至要从a[0]再回溯时,说明已经找完问题的全部解。
4、实验程序的功能模块
voidcomb(intn,intr);//计算排列函数,传入参数数组规模大小n,排列的规模大小r,输出排列结果。
5、详细代码
#include
#include
#defineN100
usingnamespacestd;
inta[N];//暂存结果数组,排列
voidcomb(intn,intr)
{inti,j;i=0;a[i]=1;
do{
if(a[i]-i<=n-r+1)/*还可以向前试探*/
{
if(i==r-1)/*已找到一个组合*/
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 子集 问题 回溯 算法 设计 实现 报告