第5章回溯法总结.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
子集和数的问题 假设有n个不同的正整数,找出这些数中所有使其和为正整数m的组合。 Sumofsub() { for(i=1;i=n;i++) x[i]=0; s=0; k=1; x[1]=1; do{ if(s+w[k]==m) 输出解; else if(kn){if(s+w[k]m) s=s+w[k]; else x[k]=0; k=k+1;x[k]=1;} else{ x[n]=0; while(x[k-1]=0 and k1) k=k-1; x[k-1]=0; s=s-w[k-1]; x[k]=1;} } while(k0) if(k=0) 无解; } * 重排原理 对于许多问题而言,在搜索试探时选取x[i]的值顺序是任意的。在其它条件相当的前提下,让可取值最少的x[i]优先。从图中关于同一问题的2棵不同解空间树,可以体会到这种策略的潜力。 图(a)中,从第1层剪去1棵子树,则从所有应当考虑的3元组中一次消去12个3元组。对于图(b),虽然同样从第1层剪去1棵子树,却只从应当考虑的3元组中消去8个3元组。前者的效果明显比后者好。 (a) (b) * 练习 例3:在任意给定的字符表(例如:‘1’,‘2’,‘3’)上,生成一个由该字符组成、含n个字符的序列,但要求生成的序列中没有两个相邻的子序列是相同的。 例如:对于n=5,序列“12321”是问题的一个解,而序列“12323”因有两个相邻的子序列都为“23”,所以该序列不是问题的解。 为找到一个满足要求的长为n个字符的序列,从空序列开始,每次检查当前序列是否含有两个相邻的子序列。在没有两个相邻的子序列相同的情况下,在序列之后添加一个字符,让序列延长。如果当前序列有两个相邻的子序列一样时,就改变序列。如此重复执行延长、检查或修改、检查,直到找到一个满足问题要求的解。 * 练习 算法: {int n,m; int good; char s[MAXLEN]; 输入欲求序列长度n; m=0; good=1; do{ if(good) {延长序列;m++;} else {改变序列;若所有字符都尝试过,则m--} good=检查当前序列是否合理的结果; }while((!good||m!=n)(m!=0)); if(m!=0) 输出解; else 输出无解; } * #include stdio.h #define MAXLEN 100 main() { int n,m; int good; int i,j; char s[MAXLEN]; printf(输入欲求序列的长度n\n); scanf(%d,n); m=0; good=1; do{ if(good) s[m++]=1; else {while(s[m-1]==3) _____?______ ______?_______; } good=1; for(j=0;goodj___?___;j++) { for(i=0;i=j;i++) if(_____?______!=_____?______) break; if(ij) good=0; }}while((!good||m!=n)(m!=0)); if(m!=0) {s[m]=\0; printf(解为%s\n,s);} else printf(无解!\n); } * #include stdio.h #define MAXLEN 100 main() { int n,m; int good; int i,j; char s[MAXLEN]; printf(输入欲求序列的长度n\n); scanf(%d,n); m=0; good=1; do{ if(good) s[m++]=1; else {while(s[m-1]==3) m--; s

文档评论(0)

a336661148 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档