网站大量收购独家精品文档,联系QQ:2885784924

实验6 子和问题的回溯算法设计与实现(报告).doc

实验6 子和问题的回溯算法设计与实现(报告).doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验6 子和问题的回溯算法设计与实现(报告)

实验6 子集和问题的回溯算法设计与实现 一、实验目的 1、掌握回溯法解题的基本思想; 2、掌握回溯算法的设计方法; 3、针对子集和数问题,熟练掌握回溯递归算法、迭代算法的设计与实现。 二、实验内容 1、认真阅读教材或参考书, 掌握回溯法解题的基本思想, 算法的抽象控制策略; 2、了解子集和数问题及解向量的定长和变长状态空间表示; 3、针对解向量的定长表示, 设计状态空间树节点扩展的规范(限界)函数及实现方法; 4、分析深度优先扩展状态空间树节点或回溯的条件; 5、分析和设计生成解向量各分量可选值的实现方法; 6、设计和编制回溯算法的递归和迭代程序。 【实验题】: 组合数问题:找出从自然数1,2,…,n中任取r个数的所有组合。 算法的原理方法 回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。 当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。 如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。 在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,以继续试探的过程称为向前试探。 可以采用回溯法找问题的解,将找到的组合以从小到大顺序存于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]再回溯时,说明已经找完问题的全部解。 实验程序的功能模块 void comb(int n,int r); //计算排列函数,传入参数数组规模大小n,排列的规模大小r,输出排列结果。 详细代码 #include stdio.h #include iostream #define N 100 using namespace std; int a[N]; //暂存结果数组,排列 void comb(int n,int r) { int i,j; i=0; a[i]=1; do { if(a[i]-i=n-r+1)/*还可以向前试探*/ { if (i==r-1)/*已找到一个组合*/ { for (j=0;jr;j++) couta[j]; coutendl; a[i]++; continue; } i++; a[i] = a[i-1] + 1; /*向前试探*/ } else { if (i==0) return;/*已找到所有解*/ a[--i]++; } /*回溯*/ }while (1); } int main(){ int n,r; cinnr; comb(n,r); return 0; } 测试数据和相应的实验结果 Input: 3 2 1 2 3 Output: 1 2 1 3 2 3 思考题 在3×3个方格的方阵中要填入数字1到N(N≥10)内的某9个数字,每个方格填一个整数,似的所有相邻两个方格内的两个整数之和为质数。试求出所有满足这个要求的各种数字填法。 答: # include stdio.h # define N 12 void write(int a[ ]) { int i,j; for (i=0;i3;i++) { for (j=0;j3;j++) printf(%3d,a[3*i+j]); printf(\n); } scanf(%*c); } int b[N+1]; int a[10]; int isprime(int m) { int i; int primes[]={2,3,5,7,11,17,19

文档评论(0)

lwv089 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档