回溯算法回溯算法.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文档。上传文档
查看更多
程序中的递归过程图解如下: 回溯 可重复的全排列 假设是由1-3组成的3位数 program expl_dg; var a:array[1..10] of integer; procedure print; var i:integer; begin for i:=1 to 3 do write(a[i], ); writeln; end; procedure work(x:integer); var i:integer; begin if x3 then begin print ;exit;end; for i:=1 to 3 do begin a[x]:=i; work(x+1); end; end; begin work(1); end. 0,1背包问题 已知一个容量大小为M重量的背包和N种物品,每种物品的重量为Wi。若将物品放入背包将得到Pi的效益,求怎样选取物品将得到效益最大 算法分析 本题可以用递归求解:设当前有N个物品,容量为M;因为这些物品要么选,要么不选,我们假设选的第一个物品编号为I(1~I-1号物品不选),问题又可以转化为有N-I个物品(即第I+1~N号物品),容量为M-Wi的子问题……如此反复下去,然后在所有可行解中选一个效益最大的便可。 另外,为了优化程序,我们定义一个函数如下: F[I]表示选第I~N个物品能得到的总效益。不难推出: F[N]=Pn F[I]=F[I+1]+Pi (I=1…N-1) 假设当前已选到第I号物品,如果当前搜索的效益值+F[I+1]的值仍然比当前的最优值小,则没有必要继续搜索下去。 算法框架 procedure search(i:integer; j:byte); {递归求解} var k :byte; begin if now+f[j]=ans then exit; {如果没有必要搜索下去} if nowans then begin {修改最优解} ans:=now; out:=ou; end; for k:=j to n do {选取物品} if w[k]=i then begin now:=now+p[k]; ou[k]:=true; search(i-w[k],k+1); now:=now-p[k]; ou[k]:=false; end; end; 四皇后问题的递归实现 数字排列问题的递归实现 骑士游历问题的递归实现 回溯法的递归算法框架: 测试2、计算折分方案 测试8、01字符串问题 测试9.错排问题(02年初赛) 测试10.排队购票 测试11 、棋盘覆盖 测试12、组合的输出 某乡有n个村庄(1n40),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0s1000)是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。 输入:村庄数n和各村之间的路程(均是整数)。 输出:最短的路程。 样例输入: 3 {村庄数} 0 2 l {村庄1到各村的路程} 1 0 2 {村庄2到各村的路程} 2 1 0 {村庄3到各村的路程} 样例输出: 3 测试1、售货员的难题 算法分析: 题目给定的村庄数不多(040),所以可以用回溯的方 法,从起点出发找出所有经过其他各村庄的回路,计算其中的最短路程。用一个过程road(step,line:byte)来描述走的状况,其中step是当前已到过的村庄数、line是当前所在的村庄。如果step=n,接下去只能回起点了,此时看第line个村庄到起点的路程加上已走的总路程,如果它比最小值还小则替换最小值。如果step还小于n,那么将还没有到过的村庄一个一个地试过去,再调用下一步road(step+1,新到的村庄号)。 var a:array[1..40,1..40] of integer; n,i,j:integer; min,m:longint; bj:array[1..40] of boolean; begin readln(n); for i:

文档评论(0)

带头大哥 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档