C语言第十一章算法导论.ppt

第11章 算法 第11章 算法 11.1 算法基本概念 11.1.1 什么是算法 11.1.2 算法基本要素 11.1.2 算法基本要素 11.1.2 算法基本要素 11.1.2 算法基本要素 11.1.3 算法求解过程 11.2 算法分析 11.2.1 时间复杂度 11.2.1 时间复杂度 11.2.1 时间复杂度 11.2.1 时间复杂度 11.2.1 时间复杂度 11.2.1 时间复杂度 11.2.1 时间复杂度 11.2.1 时间复杂度 11.2.1 时间复杂度 11.2.1 时间复杂度 11.2.2 空间复杂度 11.2.2 空间复杂度 11.2.2 空间复杂度 11.2.2 空间复杂度 11.3.1 分治法 11.3 常用算法 11.3.1 分治法 11.3.1 分治法 11.3.1 分治法 11.3.1 分治法 11.3.1 分治法 11.3.1 分治法 11.3.1 分治法 11.3.1 分治法 11.3.1 分治法 11.3.2 动态规划 11.3.2 动态规划 11.3.2 动态规划 11.3.2 动态规划 迷宫探宝 11.3.2 动态规划 11.3.2 动态规划 11.3.2 动态规划 11.3.2 动态规划 11.3.2 动态规划 11.3.2 动态规划 11.3.2 动态规划 11.3.2 动态规划 11.3.2 动态规划 11.3.2 动态规划 11.3.2 动态规划 11.3.3 贪心算法 11.3.3 贪心算法 11.3.3 贪心算法 11.3.3 贪心算法 迷宫探宝 11.3.3 贪心算法 11.3.3 贪心算法 11.3.3 贪心算法 11.3.3 贪心算法 11.3.3 贪心算法 11.3.3 贪心算法 11.3.3 贪心算法 11.3.4 回溯法 11.3.4 回溯法 11.3.4 回溯法 11.3.4 回溯法 11.3.4 回溯法 11.3.4 回溯法 11.3.4 回溯法 11.3.4 回溯法 11.3.4 回溯法 11.3.4 回溯法 结束 例11.8 1 #include stdio.h 2 int EgyptianFraction(int a,int b,int D[20]) 3 { //贪心算法求a/b的埃及分数,求解结果放在D中 4int n=0,j,u,c; 5j=b; 6for(;;) { //反复循环求解 7c=b/a+1; 8if (c1000000000||c0) return 0; 9if (c==b) c++; 10D[++n]=c; //得到第n个分母 11a=a*c-b; //准备下一次计算 12b=b*c; 例11.8 13for (u=2;u=a;u++) 14while (a%u==0b%u==0) 15a=a/u , b=b/u; 16if (a==1 b!=j) { //结束求解 17D[++n]=b; 18break; 19} 20} 21return n; //有解返回分式项数 22 } 例11.8 23 int main() 24 { 25int a,b,n,i,D[20]; 26scanf(%d%d,a,b); //输入分子、分母 27n=EgyptianFraction(a,b,D); 28if (n0) { //输出埃及分数式 29printf(%d/%d=1/%d,a,b,D[1]); 30for (i=2;i=n;i++)printf(+1/%d,D[i]); 31printf(\n); 32} 33return 0; 34 } 1.基本思想 回溯法(backtracking)是一个既带有系统性又带有跳跃性的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。 回溯法求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。回溯法求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于求解组合数较大的问题。 应用回溯法解问题时,首先应明确定义问题的解空间,问题的解空间至少应包含问题的一个(最优)解。 确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索

文档评论(0)

1亿VIP精品文档

相关文档