B5-搜索与回溯算法.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文档。上传文档
查看更多
B5-搜索与回溯算法

搜索与回溯算法——例9 搜索与回溯算法——例9 #includeiostream using namespace std; int n,k; int f(int a,int b,int c) { int g=0,i; if (b==1) //递归边界,只划分1份 g=1; else for (i=c;i=a/b;i++) //第一个数的取值为c~a/b g+=f(a-i,b-1,i); //未划分的数有a-i,需划分为b-1份,每份最小为i return g; } int main() { cin n k; coutf(n,k,1); return 0; } 时间复杂度:   由于在搜索每一位数字的数值时做到了①保证有解②没有重复,整个搜索过程没有无用或重复的搜索分支,因此时间复杂度跟本题的答案是同一个数量级别。答案的数量级别估算如下:   1、不排除重复,把n分为k份,有C(n-1,k-1)种分法   2、n和k的数字越大,其中重复的比例越接近于A(k,k) 所以估计本题的时间复杂度为O(C(n-1,k-1)/k!)   当n=200,k=6时,时间复杂度为10^6 搜索与回溯算法——例9 【算法分析3——动态循环枚举】 回到第一种思路,枚举出所有组合,然后逐一判断组合是否满足条件。在数据规模较大时,将因为组合数量很大而超时。事实上,绝大部分的组合是不满足条件的,如果能减少或不枚举不满足条件的组合,那么将极大地节省运行时间,这在搜索中称为剪枝。 以n=7,k=3为例: 第1个数的枚举范围为1~2 第2个数的枚举范围根据第1个数动态调整 ①1 × ×:剩余6,第2个数的枚举范围为1~3 ②2 × ×:剩余5,第2个数的枚举范围为2~2 第3个数即最后1个数必须等于剩余的数,不需枚举 假设在枚举第dep个数时,还剩余rest,第det-1个数为last, 若depk,则第i个数的枚举范围是last~rest/(k-dep+1) 若dep=k,则第i个数等于rest,得到一个满足条件的组合 搜索与回溯算法——例9 #includeiostream using namespace std; int n,k,total; void select(int dep,int rest,int last) { int i; if (dep==k) //最后1个数只能等于rest,不需枚举,得到一个解 total++; else for (i=last;i=rest/(k-dep+1);i++) //枚举第dep个数 select(dep+1,rest-i,i); //递归枚举下一个数 } int main() { cin nk; total=0; select(1,n,1); //从第一个数开始枚举 couttotal; return 0; } 时间复杂度参照上一个解法 上机练习 1、全排列问题: 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 2、组合的输出: 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。 现要求你用递归的方法输出所有组合。 3、N皇后问题: 在N*N的棋盘上放置N个皇后(n=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。 4、有重复元素的排列问题: 设R={r1,r2,…,rn}是要进行排列的n个元素。其中元素r1,r2,…,rn可能相同。试设计一个算法,列出R的所有不同排列的总数。 上机练习 5、子集和问题: 对于给定的正整数的集合S={x1,x2,…,xn}和正整数c,判定是否存在S的一个子集S,使得子集S所有元素的和等于c。 6、工作分配问题: 设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij。试设计一个算法,为每一个人都分配一件不同的工作,并使总费用达到最小。 7、装载问题: 有一批共n个集装箱要装上艘载重量为c的轮船,其中集装箱i的重量为wi。找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船。 8、字符序列: 从三个元素的集合[A,B,C]中选取元素生成一个N个字符组成的序列,使得没有两个相邻字的子序列(子序列长度=2)相同。 例:N=5时ABCBA是合格的,而序列ABCBC与ABABC是不合格的,因为其中子序列BC,AB是相同的。 求出满足条件的N (1=N=12)个字符的所有序列总数。 上机练习 9、迷宫问题: 设

文档评论(0)

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

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

1亿VIP精品文档

相关文档