收藏 分享(赏)

算法设计教程05.ppt

上传人:fmgc7290 文档编号:4843240 上传时间:2019-01-16 格式:PPT 页数:84 大小:984KB
下载 相关 举报
算法设计教程05.ppt_第1页
第1页 / 共84页
算法设计教程05.ppt_第2页
第2页 / 共84页
算法设计教程05.ppt_第3页
第3页 / 共84页
算法设计教程05.ppt_第4页
第4页 / 共84页
算法设计教程05.ppt_第5页
第5页 / 共84页
点击查看更多>>
资源描述

1、第5章 回溯法,引入问题,回溯是重要的算法之一 要求找到一组解,或要求找到一个满足某些限制的最优解。 -通过彻底的搜索方法来解决。*彻底的搜索,需要进行大量的比较、舍弃、运算时间为代价。因此,用穷举法解某些实际问题是不现实的.*彻底搜索的运算量很大,有时大到计算机承受不了的程度。 -使用回溯法可以大大减少实际的搜索。例如,迷宫问题,八皇后问题,骑士周游世界问题。,引入问题,关键:找到回溯的条件。 算法思想: 通过对问题的分析,找出一个解决问题的线索,然后沿着这个线索往前试探,若试探成功,就得到解,若试探失败,就逐步往回退,换别的路线再往前试探。实际上是广度与深度搜索结合的搜索,深度搜索过程中碰

2、到条件不满足,则退回上一层,在每一层上也进行全面的搜索。,5.1 回溯法的基本思想,回溯法是带优化的穷举法。 回溯法的基本思想:在一棵含有问题全部可能解的状态空间树上进行深度优先搜索,解为叶子结点。 在回溯法中,并不是先构造出整棵状态空间树,再进行搜索,而是在搜索过程中逐步构造出状态空间树,即边搜索,边构造。,回溯法在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。 算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。 (1)如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。 (2)否则,进入该子树,继续按深度优先的策略

3、进行搜索。 回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。 回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。,A,例如,对于有n种可选物品的0-1背包问题,其解空间由长度为n的0-1向量组成。 以3件物品实例,扩展结点:一个正在产生儿子的结点称为扩展结点 活结点:一个自身已生成但其儿子还没有全部生成的节点称做活结点 死结点:一个所有儿子已经产生的结点称做死结点,从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。这个开始结点-活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为一个新的活结点

4、,并成为当前扩展结点。,如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法即以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。,回溯法为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。 具有限界函数的深度优先生成法称为回溯法。,示例1 0-1背包问题 n=3, C=30, w=16, 15, 15, v=45, 25, 25,示例1 0-1背

5、包问题(学生自己看),开始时,Cr=C=30,V=0,A为唯一活结点,也是当前扩展结点 扩展A,先到达B结点 Cr=Cr-w1=14,V=V+v1=45;此时A、B为活结点,B成为当前扩展结点;扩展B,先到达C Crw2,C导致一个不可行解,回溯到B 再扩展B到达D D可行,此时A、B、D是活结点,D成为新的扩展结点;扩展D,先到达E Crw3,E导致一个不可行解,回溯到D 再次扩展D到达F;由于F是叶结点,即得到一个可行解x=(1,0,0),V=45 F不可扩展,成为死结点,返回到D D没有可扩展结点,成为死结点,返回到B B没有可扩展结点,成为死结点,返回到A,A再次成为扩展结点,扩展A到

6、达G Cr=30,V=0,活结点为A、G,G为当前扩展结点 扩展G,先到达H Cr=Cr-w2=15,V=V+v2=25,此时活结点为A、G、H,H成为当前扩展结点 扩展H,先到达I Cr=Cr-w3=0,V=V+v3=50 I是叶结点,且5045,皆得到一个可行解x=(0,1,1),V=50 I不可扩展,成为死结点,返回到H 再扩展H到达J J是叶结点,且2550,不是最优解 J不可扩展,成为死结点,返回到H H没有可扩展结点,成为死结点,返回到G 再扩展G到达L Cr=30,V=0,活结点为A、G、L,L为当前扩展结点 扩展L,先到达M,M是叶结点,且2550,不是最优解,又M不可扩展,返

7、回到L 再扩展L到达N,N是叶结点,且050,不是最优解,又N不可扩展,返回到L L没有可扩展结点,成为死结点,返回到G G没有可扩展结点,成为死结点,返回到A A没有可扩展结点,成为死结点,算法结束,最优解X=(0,1,1),最优值V=50,示例2 旅行售货员问题,问题描述:某售货员要到若干(n)城市去推销商品,已知各城市之间的路程,要选定一条从驻地出发,经过每个城市一遍,最后回到住地的路线,使总的路程最短。 该问题是一个NP完全问题, 有(n-1)!条可选路线,示例2 旅行售货员问题,解集:(1,2,4,3,1), (1,3,2,4,1), (1,4,3,2,1), .最优解: (1,3,

8、2,4,1),最优值25,回溯法的应用步骤1、针对所给问题,定义问题的解空间;2、确定易于搜索的解空间结构;3、以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。常用剪枝函数: 用约束函数在扩展结点处剪去不满足约束的子树; 用限界函数剪去得不到最优解的子树。,关于复杂性: 回溯法的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。 如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n)。,递归回溯,回溯法对解空间作深度优先搜索,因此,在一般情况下用递归方法实现回溯法。,void ba

9、cktrack (int t) / t:递归深度 if (tn) output(x); /当搜索到叶结点,输出可行解elsefor (int i=f(n,t);i=g(n,t);i+) /从下界 to 上界 xt=h(i);/满足约束条件和限界函数if (Constraint(t) ,子集树,遍历子集树需O(2n)计算时间,void backtrack (int t) if (tn) output(x);elsefor (int i=0;i=1;i+) xt=i;if (legal(t) backtrack(t+1); ,从n个元素的集合找出满足某种性质的子集,相应的解空间树称为子集树。 例如

10、0-1背包问题。,排列树,确定n个元素满足某种性质的排列,相应的解空间树称为排列树。排列树通常有n!个叶结点。因此遍历排列树需要O(n!)计算时间。例如N后问题、旅行售货员问题的解空间是一棵排列树。,八皇后问题,是一个古老而著名的问题。该问题是十九世纪著名的数学家高斯1850年提出。 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。,5.2 N皇后问题,问题描述 在*的棋盘上,放置个皇后,要求每一横行,

11、每一列,每一对角线上均只能放置一个皇后,求可能的方案及方案数。 问题的状态即棋盘的布局状态,状态空间树为根为空棋盘,每个布局的下一步可能布局为该布局结点的子结点; 任意两个王后不放在同一行或同一列或同一斜线。因此为了简化状态空间树,采用逐行布局的方式,即每个布局有n个子结点。,5.2 N皇后问题,一、回溯过程分析: 1、从空棋盘起,逐行放置棋子。 2、每在一个布局中放下一个棋子,即推演到一个新的布局。 3、如果当前行上没有可合法放置棋子的位置,则回溯到上一行,重新布放上一行的棋子。,5.2 N皇后问题,5.2 N皇后问题,二、存储结构 (1)二维数组ANN存储皇后位置 若第i行第j列放有皇后,

12、则Aij为非0值,否则值为0。 (2)一维数组Mk、Lk、Rk分别表示竖列、左斜线、右斜线是否放有棋子,有则值为1,否则值为0。,K值和皇后位置坐标i,j的关联?,k=i+j k=0 -2*(N-1),k值和皇后位置坐标i,j的关联?,k=i-j k会出现负值,k=i-j+N k=1 -2*(N+1),Mk(k=j) Lk ( k=i+j) Rk ( k=i-j+N),三、算法描述 初始化 for(某一行的每个位置) if (安全) 放皇后; if (已到最后一行) 输出; else 试探下一行;去皇后; ,5.2 N皇后问题,安全算法:!Mj,#define N 4 /*N为皇后个数*/ i

13、nt count=0; int MN=0,L2*N=0,R2*N=0; int ANN=0; /*皇后位置*/ void print(int ANN); int mytry(int i,int MN,int L2*N,int R2*N,int ANN); void main() int n=mytry(0,M,L,R,A); /代表从0行开始试探cout“n count=”n; /n可行解数目,/*试探每一行皇后的位置*/ int mytry(int i,int MN,int L2*N,int R2*N,int ANN) for(int j=0; jN;j+) /放置在i行j列if(!Mj,v

14、oid print(int ANN) /*输出*/int i,j;for(i=0;iN;i+)for(j=0;jN;j+)cout“ “Aij;coutendl;,5.3 回溯法求解0-1背包问题,解空间:子集树 可行性约束函数:,解题的基本指导思想: 按贪心法的思路,优先装入价值/重量比大的物品。 当剩余容量装不下最后考虑的物品时,再用回溯法修改先前的装入方案,直到得到全局最优解为止。,/*数据结构*/ #define N 5 /物品数目 int v=6,3,6,5,4,w=2,2,4,6,5; int C=10; /背包容量 int cp; /当前价值 int bestp=0; /最优价值

15、 int xN; /当前解 int bestxN;/*当前最优解*/,void main() /按物品价值重量比排降序(省略代码)/输出物品初始价值、重量(省略代码)knap(0);cout“最优价值:“bestp“t“;cout“此时放入背包物品:“;for(j=0;jN;j+)if(bestxj=1) coutj+1“ “;coutendl; ,void knap(int t) /*回溯*/ if(t=N) if(bestpcp) bestp=cp; /保存最优解for (int j=0;jN;j+)bestxj=xj;putout();else if(wt=C) /搜索左枝 xt=1;

16、cp+=vt; C-=wt;knap(t+1); /继续向下深度搜索xt=0; C+=wt; cp-=vt; /回退xt=0; /搜索右枝knap(t+1); ,/*输出*/ void putout( ) cout“物品放入背包状态为:“;for(int i=0;iN;i+)coutsetw(5)xi;cout“ 获得的价值=“cp;coutendl; ,实际搜索解空间树策略: 只要其左儿子结点是一个可行结点,搜索就进入其左子树。约束函数 当右子树有可能包含最优解时才进入右子树搜索,否则将右子树剪去。 限界函数,前面算法完全搜索解空间树:即用约束条件确定是否搜索其左子树; 对右子树没有任何判断

17、,一定进入右子树搜索。-耗时,剪枝方法: r:当前剩余物品价值总和; cv:当前获得价值; bestp:当前最优价值。 当cv+r=bestp时,可剪去右子树。 计算右子树上界方法: 将剩余物品依其单位重量价值排序,然后依次装入物品,直至装不下时,再装入该物品的一部分而装满背包。由此得到的价值是右子树中解的上界。,int Bound(int i) /计算当前结点处上界 int left=C-cw; /剩余容量int b=cv; /cv当前价值while (wi=left ,const int N=5;/*物品个数*/ int cv=0;/*当前价值*/ int cw=0;/*当前重量*/ in

18、t bestv=0;/*当前最优价值*/ int bestxN+1;/*当前最优解*/ int C=10;/*背包容量*/ int vN+1=0,6,3,6,5,4,wN+1=0,2,2,4,6,5; /*物品价值、重量。0元素不用*/ int xN+1=0; /xi表示物品i当前是否加入背包 void main() Backtrack(1);putout(); ,void Backtrack(int i) /回溯求最优解 int j;if(iN) /*到叶结点*/ for (j=1;jbestv)/*搜索右子树*/ xi=0;Backtrack(i+1); ,void putout() co

19、ut“放入背包的物品是:“;cw=0;for (int i=1;i=N;i+)if (bestxi=1) couti“t“; cw+=wi;coutendl“放入背包物品总重为:“cw“t“;cout“最大价值和为:“bestvendl; ,0-1背包课件演示.cpp,5.3 练习-画出剪枝图,5.4 素数环问题,素数环: 把从1到N这N个数摆成一个环,要求相邻的两个数的和是一个素数。,5.4 素数环问题,8以内的素数环:,问题分析 从1开始,每个空位有9种可能,每种可能加入约束条件即可 1.与前面所有的数不重复 2.与前一个数和为素数(最后一个和第一个也要满足)。 算法流程 1、数据初始化;

20、 2、递归填数: 判断第J种可能是否合法; A、如果合法:填数;判断是否到达目标(10个已填完): 是,打印结果;不是,递归填下一个; B、如果不合法:选择下一种可能;,5.4 素数环问题,以4个数为例。,首先第一个为1-从未选过的值中按从小到大选取下个节点-判断它和上个节点的和是否为素数,如果不为素数则此节点选取下个值,如果是素数则走向下个节点。 第二节点为2 第三个节点值为3 第四个节点值为4 当遇到最后一个节点时还要判断它和第一个节点的和是否为素数 输出此次循 环的最终值:1,2,3,4. 开始回溯。回到上个节点,对节点取另一个值(由小到大且不和原先选过的重复),然后继续按照前述规则判断

21、。 回到第三节点,上次选取值为3,比它大且按顺序没选过的值为4,但2+4不是素数,且4是最后一个可选的数,因此不用继续下去了,开始回溯。 回到 第二节点,选取节点值为3,但1+3不是素数 第二节点再次选取下一个值4,5.4 素数环问题关键算法,#define N 10 int aN+1;/*a数组存放素数环*/ void search(int); void init(); void printresult(); int isprime(int); void myswap(int ,int ); void main() init();search(2); /*递归搜索*/,void init()

22、 int i;for(i=1;i=N;i+)ai=i; ,void search(int m) int i;if(mN) /*当已经搜索到叶结点*/ if(isprime(a1+aN) /*首尾两数相加是素数*/printresult( ); /*输出当前解*/return;elsefor(i=m;i=N;i+) /*(排列树)*/ myswap(m,i); /*交换am和ai*/if(isprime(am-1+am) search(m+1); /*递归搜索下一个位置*/myswap(m,i); /*把am和ai换回来*/ ,5.4 素数环问题算法,int isprime(int num) i

23、nt i,k;k=sqrt(num);for(i=2;i=k;i+)if(num%i=0) return 0; return 1; ,5.4 素数环问题算法,void printresult() int i;for(i=1;i=N;i+)coutsetw(3)ai;coutendl; ,void myswap(int m, int i) int t;t=am;am=ai;ai=t;,思考:,数字全排列问题: 任意给出从1到N的N个连续的自然数,求出这N个自然数的各种全排列。如N=3时,共有以下6种排列方式: 123,132,213,231,312,321。 注意:数字不能重复,N由键盘输入(N

24、=9)。,void perm(char *list, int i, int n)、 int j,temp; if(i = n)for(j = 0; j n; j+) coutlistj; cout“ ”; elsefor(j = i; j n; j+)SWAP(listi,listj,temp); perm(list,i+1,n); SWAP(listi,listj,temp); /*初始i = 0;*/,回溯和递归的区别 递归法好比是一个军队要通过一个迷宫,到了第一个分岔口,有3条路,将军命令3个小队分别去探哪条路能到出口,3个小队沿着3条路分别前进,各自到达了路上的下一个分岔口,于是小队长

25、再分派人手各自去探路只要人手足够(对照而言,就是计算机的堆栈足够),最后必将有人找到出口,从这人开始只要层层上报直属领导,最后,将军将得到一条通路。 回溯法则是一个人走迷宫的思维模拟,只寄希望于自己的记忆力。回溯实际上是递归的展开。,练习,问题描述原始部落居民为了争夺资源经常发生冲突,几乎每个居民都有仇敌。部落酋长为了组织一支队伍,希望从部落中挑出最多的居民入伍,并保证队伍中任何两个人都不是仇敌。 任务给定居民间仇敌关系,输出组成队伍的最佳方案。 输入居民人数,居民间仇敌个数,仇敌关系 输出部队人数,那些居民入选,5.5 装载问题,有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中

26、集装箱i的重量为wi,且,装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。,5.5 装载问题,可以证明,如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。 (1)首先将第一艘轮船尽可能装满; (2)将剩余的集装箱装上第二艘轮船。 将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近。由此可知,装载问题等价于以下特殊的0-1背包问题。,用回溯法设计解装载问题的O(2n)计算时间算法。,5.5 装载问题,解空间:子集树 可行性约束函数(选择当前元素): 上界函数(不选择当前元素): 当前载重量cw+剩余集装

27、箱的重量r当前最优载重量bestw,5.5 装载问题,void backtrack (int i)/ 搜索第i层结点if (i n) / 到达叶结点更新最优解bestx,bestw;return;r -= wi;if (cw + wi bestw) xi = 0; / 搜索右子树backtrack(i + 1); r += wi;,5.6 批处理作业调度(略),给定n个作业的集合J1,J2,Jn。每个作业必须先由机器1处理,然后由机器2处理。机器j处理作业Ji需要时间为tij(i=1,2n;j=1,2)。对于一个确定的作业调度,设Fij是作业i在机器j上完成处理的时间。所有作业在机器2上完成处

28、理的时间和称为该作业调度的完成时间和。 批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。,5.6 批处理作业调度,这3个作业的6种可能的调度方案是1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1;它们所相应的完成时间和分别是19,18,20,21,19,19。易见,最佳调度方案是1,3,2,其完成时间和为18。,5.6 批处理作业调度,0 2 5 7,0 2 3 5 6 7 10,调度方案是1,2,3,相应的完成时间和是 19=3+6+10,调度方案是1,3,2,相应的完成时间和是 18=3+7+8,0 2 4 7,0 2 3 4

29、7 8,解空间:排列树,void Flowshop:Backtrack(int i) if (i n) for (int j = 1; j f1)?f2i-1:f1)+Mxj2;f+=f2i;if (f bestf) Swap(xi, xj);Backtrack(i+1);Swap(xi, xj);f1- =Mxj1;f- =f2i; ,int *M, / 各作业所需的处理时间*x, / 当前作业调度*bestx, / 当前最优作业调度*f2, / 机器2完成处理时间f1, / 机器1完成处理时间f, / 完成时间和bestf, / 当前最优值n; / 作业数,5.6 连续邮资问题(略),【问

30、题描述】假设国家发行了N种不同面值的邮票,并且规定每张信封上最多只允许贴M张邮票。连续邮资问题要求对于给定的N和M的值,给出邮票面值的最佳设计,在1张信封上可贴出从邮资1开始,增量为1的最大连续邮资区间。,例如,当N=5和M=4时,面值为(1,3,11,15,32)的5种邮票可以贴出邮资的最大连续邮资区间是1到70。,x1:N:表示N种不同的邮票面值,并约定它们从小到大排列。x1 = 1是惟一的选择。 (1)在未确定剩余其它N1种邮票面值的情况下,只用x1一种邮票面值,所能得到的最大连续邮资区间是1:M。 (2)确定x2的取值范围x2的值最小可以取到2,最大可以取到M+1。 (3)一般的情况下

31、,若已选定x1到xi-1,最大连续邮资区间是1:r时,接下来xi的可取值范围是xi-1+1 :r+1。,5.7 连续邮资问题,若x1到xi-1,最大连续邮资区间是1:r时,接下来xi的可取值范围是xi-1+1 :r+1。 例如,当N=3和M=2时,【解决方案及基本思想 】,(1)基本思路: 搜索所有可行解,当i=N时,当前结点Z是解空间中的内部结点。在该结点处x1:i-1能贴出最大连续区间为r。因此,在结点Z处,x的可能取值范围是xi-1+1:r+1,从而,结点Z有r-xi-1+1个儿子结点。算法对当前结点Z的每一个儿子结点以深度优先遍历的方式递归的对应子树进行搜索,从而找出最大连续邮资区间的

32、方案。 (2)解向量: 用n元组x1:n表示N种不同的邮票面值,并约定它们从小到大排列。x1=1是唯一的选择。(x表第i张邮票的面值),【解决方案及基本思想 】,(3)可行性约束函数: 已选定x1:i-1,最大连续邮资区间是1r,下来x的可取值范围是xi-1+1r+1。(r表x1:i-1所能达到的连续区间的上界),5.7 连续邮资问题,如何确定r的值? (1)计算X1:i的最大连续邮资区间在本算法中被频繁使用到,因此势必要找到一个高效的方法。 (2)直接递归的求解复杂度太高,尝试计算用不超过M张面值为x1:i的邮票贴出邮资k所需的最少邮票数yk。通过yk可以很快推出r的值。 (3)yk可以通过

33、递推在O(n)时间内解决:具体代码参见附件回溯法“连续邮资问题”,5.7 图的m着色问题(略),给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。,把n个板块抽象为一个图的n个顶点,解向量:(x1, x2, , xn)表示顶点i所着颜色xi 可行性约束函数:顶点i与已着色的相邻顶点颜色不重复。,图的m着色问题,void Color:Backt

34、rack(int t) if (tn) /*n:顶点数*/ sum+;输出 xi;elsefor (int i=1;i=m;i+) xt=i; /*设置颜色*/if (Ok(t) Backtrack(t+1); Int Color:Ok(int k) /* 检查颜色可用性*/ for (int j=1;j=n;j+)if (akj=1) ,图的m着色问题,复杂度分析 图m可着色问题的解空间树中内结点个数是 对于每一个内结点,在最坏情况下,用ok检查当前扩展结点的每一个儿子所相应的颜色可用性需耗时O(mn)。因此,回溯法总的时间耗费是,考场安排图的着色原理之运用(略),【问题描述】 设学校共有n

35、门课,需要进行期末考试,因为不少学生不止选修一门课程,所以不能把同一个学生选修的两门课程安排在同一场次进行考试,问学期的期末考试最少需多少场次考完? 【问题分析】 本问题可转换成是对一平面图的顶点着色问题判定,采用回溯法求解。将所选的每门课程变成一个结点,若一个同学选了m(1mn)门课程时,则这m门课程所对应的结点互相用一条边连接起来。则相邻边的顶点不能着同一种颜色,既不能安排在同一场次考试。但本题又不同于m-着色问题,而是要求最少场次考完,故本问题是求min-着色问题,既所有的顶点最少可用多少种颜色来着色,则本问题可解。,【数据结构】 图的邻接矩阵testMAXMAX来表示一个图G,其中若(

36、i,j)是G的一条边,则testij= testji =1,否则testij= testj i =0,因为本问题只关心一条边是否存在,所以用邻接矩阵。颜色总数用总课程数目N表示。生成解则用数组valueMAX来记录,其中valuei是结点i的颜色,即课程i可安排在第valuei场考试,resultMAX用来记录最优解。程序中N表示课程总数,minSum表示最少的考试场次。,【主要算法】 testArrange( ) /找一个图的考试方案 if(k=N) if(jminSum)/记录最少的考试场数 minSum=j;for(t=1;t=N;t+)resultt=valuet;/记录最优解elsetestArrange(k+1);/递归调用,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报