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

算法分析与设计[6].ppt

  1. 1、本文档共80页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
6.8 子集和数问题 多年来虽然已经证明用5种颜色足以对任一幅地图着色,但是一直找不到一定要求多于4种颜色的地图。 直到1976年这个问题才由科学家利用电子计算机的帮助得以解决。他们证明了4种颜色足以对任何地图着色。 我们所考虑的不只是由地图产生的图,而是所有的图。讨论在至多使用m种颜色的情况下,可对一给定的图进行着色的所有不同的方法。 图的着色问题的显示约束条件:Xi表示取值于m种颜色数 隐式约束条件:有边相连的两个点的颜色数不能相同。即若 GRAPH (i, j)=1,则Xi != Xj 。 下面给出图着色问题的一个递归回溯算法。 图G用它的邻接矩阵GRAPH(1:n,1:n)表示。它计算并打印出符合以下要求的全部解:把整数1,2,…,m分配给图中各个结点且使相邻近的结点的有不同的整数。K是下一个要着色结点的下标。 0 3 1 X 4 3 2 1 Q2 Q1 k=3; while (k0) do { X[k]=X[k]+1; while (X[k]=n and Not PLACE(k)) do if (X[k]≮n) then 不执行 else k=k-1=2; //回溯 } end while k=2; while (k0) do { X[k]=X[k]+1=3+1=4; while ( X[k]=n and Not PLACE(k) ) do 1=n and Not false , X[k]=X[k]+1=2; 2=n and Not false , X[k]=X[k]+1=3; 4=n and Not true , 循环不执行 if (X[k]=n) then if (k≠n) then 不执行 else { k=k+1=3; X[3]=0; } } end while Q2 1 3=n and Not false , X[k]=X[k]+1=4; 4=n and Not false , X[k]=X[k]+1=5; 2 3 4 5 4 0 5≮n , 循环不执行 子集和数问题: 假定有n个不同的正数, 要求找出这些数中所有使得某和数为M的组合 问题描述: 已知n+1个正数: wi (1≤i≤n)和M, 要求找出wi的和数是M的所有子集 本节将利用大小固定的元组来研究一种回溯算法,解决这一问题 例: n=4 , (w1, w2, w3, w4 )=(7, 11, 13, 24) , M=31 满足要求的子集是(1, 1, 1, 0)和(1, 0, 0, 1) 生成图中任一结点的儿子: 对于i级上的一个结点, 其左儿子对应于X(i)=1, 右儿子对应于X(i)=0 对于限界函数的一种简单选择是: 当且仅当∑W(i)X(i)+∑W(i)≥M 时, B(X(1)…X(k))=true i=1 k i=k+1 n 若W(i)按升序排列, 则限界函数可以被强化: 1 x1=1 x1=0 2 3 11 16 12 13 10 14 15 4 7 8 9 5 6 x2=1 x3=1 1 0 1 0 1 0 x2=0 x3=0 x3=1 x3=0 1 0 21 17 18 25 19 22 23 24 20 x2=1 x2=0 x3=1 x3=0 1 0 1 0 … … 当且仅当∑W(i)X(i)+∑W(i)≥M i=1 k i=k+1 n B(X(1)…X(k))=true 且∑W(i)X(i)+W(k+1)≤M 时 i=1 k void SUMOFSUB(int s, int k, int r) { float W(1:n); int X(1:n); int j; X[k]=1; if (s+W[k]==M) then { print(X[j], j=1 to k); print(X[j]=0, j=k+1 to n); return; } else if (s+W[k]+W[k+1]=M) then call SUMOFSUB(s+W[k], k+1, r-W[k]); if (s+r-W[k]=M and s+W[k+1]=M) then { X[k]=0; call SUMOFSUB(s, k+1,r-W[k]); } } 子集和数问题的递归回溯算法 //进入此过程时X(1)…X(k)的值已确定;

文档评论(0)

好文精选 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档