剪枝的由来:
暴力破解中,依靠计算机的强大计算能力时,必须考虑计算性能和计算限度
eg: 100W的双层for循环,计算机就会比较吃力,耗时较长.
如果某个问题考虑情况较多,我们可以尝试在逻辑中排除不可能的情况,或者从循环中找出一些规律来排除循环次数(eg 案例2),减少计算次数,这就是剪枝的由来。
案例如下:
public class pruning { public static void main(String[] args) { example2(); } /** * 剪枝-找钱问题---使用暴力破解(未含有枝剪) * 1 找8元钱 * 2有零钞: 5元,2元,1元,5角 * 问: 所有找钱方案 * * 将角换算成元,避免浮点数运算造成的误差 * 结果: 多个结果 ,此处没有列举 */ public static void example1(){ // x表示5元个数 y表示2元个数 z表示1元个数 m表示0.5元个数 int count = 0; for(int x=0; x<=80/50; x++){ for(int y=0; y<=80/20; y++){ for(int z=0; z<=80/10; z++){ for(int m=0; m<=80/5; m++){ ++count; if(x*50 + y*20 + z*10 + m*5 == 80){ System.out.println("第" +count + "次结果---> 5元为: " + x + "次" + " 2元为: " + y + "次" + " 1元为: " + z + "次" + " 5角为: " + m + "次"); } } } } } } /** * 剪枝: 尽早排除不合逻辑的情况, 在暴力破解情况下优化查询次数 * * 以上计算次数过多,增加过多无意义的计算 eg: 如果有一次5元,那么第二次2元循环中,只能最多出现1次,而没优化情况下,是从1次到4次都执行 */ public static void example2(){ // x表示5元个数 y表示2元个数 z表示1元个数 m表示0.5元个数 int count = 0; for(int x=0; x<=80/50; x++){ for(int y=0; y<=80/20; y++){ if((80 - 50*x - 20*y) < 0 ){break;} // 尽早排除不合逻辑的情况 for(int z=0; z<=80/10; z++){ if((80 - 50*x - 20*y - 10*z) < 0 ){break;} // 尽早排除不合逻辑的情况 ++count; int m = (80 - (x*50 + y*20 + z*10))/5; if(x*50 + y*20 + z*10 + m*5 == 80){ System.out.println("第" +count + "次结果---> 5元为: " + x + "次" + " 2元为: " + y + "次" + " 1元为: " + z + "次" + " 5角为: " + m + "次"); } } } } } }
案例2:
/** * 求n的平方尾数仍为n数本身的数字 */ public class square { public static void main(String[] args) { /*for(int i=0; i<10; i++){ int n = i*i; if(n%10 == i){ System.out.println("平方为: " + n + " 数字为: " + i); } }*/ for(int i=10; i<100; i++){ int n = i*i; int m = i%10; if(m != 0 && m!= 1 && m!= 5 && m!= 6){ // 如果个位数不是左侧这几种的话,那么平方后的结果个位数肯定和原数各位不一致,这情况下直接剪枝 continue; }; if(n%100 == i){ System.out.println("平方为: " + n + " 数字为: " + i); } } } }
相关推荐
这个讲稿深入浅出地讲解了在编程竞赛中常用的两种核心策略——枚举和搜索,对提高参赛者在解决复杂问题时的能力具有极大的帮助。 【枚举】 枚举是一种基础的算法思想,适用于解决有限且可枚举状态空间的问题。它...
在这个“数据结构与算法_1.4 枚举(穷举)算法 (2)”的主题中,我们将深入探讨枚举算法的应用、原理及其在实际编程中的实现。 枚举算法的基本思想是系统性地列出所有可能的候选解,然后逐一验证每个候选解是否满足...
数据结构与算法是计算机科学的基础,对于理解和设计高效的程序至关重要。枚举算法,或称穷举算法,是一种常见的解决问题的方法,尤其在面对有限且可数的解决方案时。在这个"算法系列"中,我们将深入探讨枚举算法的...
总的来说,解决任务分配问题不仅需要扎实的算法基础,还需要良好的编程技巧。C++作为一种强大的系统级编程语言,提供了丰富的工具和库支持,使得我们能够高效地实现回溯法和其他算法。在实践中,根据具体问题的特性...
Apriori算法通过迭代的方式生成频繁项集,每次迭代生成比上一次更大的项集,并在过程中利用“Apriori性质”来剪枝,避免无效的候选集生成,从而提高效率。 在C++实现中,关键步骤包括: 1. 数据预处理:读取数据集...
在编程和计算机科学中,穷举,又称为枚举算法,是一种基础的解决问题的方法,它通过尝试所有可能的解决方案来找到正确答案。这种方法通常适用于问题的解空间有限且可预测的情况。枚举算法的核心思想是系统地列出所有...
枚举算法(Brute Force Algorithm)是一种常用的算法思想,它的基本思想是对所有可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。枚举法的特点是算法简单,但执行...
C语言是一种强大的、高效的编程语言,它允许直接对内存进行操作,适合处理计算密集型的任务,如枚举算法。 在解决这个问题时,我们可以创建一个二维数组,代表9个空位,数组的每个元素存储一个数字。由于每个数字...
回溯算法在此问题中的应用是枚举所有可能的物品组合,每次决策是否将当前物品放入背包,如果背包容量已满或者所有物品都被考虑过,就计算当前组合的价值,然后回溯以尝试不同的选择。 3. **旅行售货员问题**(TSP)...
标题中的“paiyang_枚举_fouro7y_二维木板排样.zip”可能是指一个关于二维木板排样的编程项目,其中“paiyang”可能是项目或作者的名称,“枚举”可能指的是在编程中使用枚举(Enumeration)数据类型或方法来处理...
搜索方法实质上是对所有可能的解决方案进行枚举,但因为其效率低下,通常需要通过剪枝技术来提升性能。本文将深入探讨搜索剪枝的常见方法与技巧。 首先,分枝定界(Branch and Bound)是一种广泛应用的剪枝策略。它...
这份教程以PPT的形式,深入浅出地讲解了ACM竞赛中常用且重要的算法思想与技巧。 在ACM算法教程中,"算法设计"是核心内容之一。它涵盖了以下几个关键知识点: 1. **基础算法**:包括排序(如快速排序、归并排序、堆...
NOIP注重算法和编程能力的培养,这可以解释文档中的枚举算法和桶排序算法的教学目的。 在文档内容方面,讲述了多个枚举算法的解法,这是一种基于尝试所有可能情况来找到答案的方法。第一种方法通过三层嵌套循环穷举...
### 算法设计与分析小论文 #### 1. 算法与数据结构 在算法设计领域,数据结构的选择对于算法效率至关重要。本文通过一个具体的实例——计算N!的准确值,来探讨如何有效地处理大整数的存储与运算。 **1.1 大整数...
"全国青少年软件编程等级考试标准(C语言1级-10级)" 本标准是中国电子学会举办的全国青少年软件编程等级考试的统一标准,旨在促进青少年软件编程能力的发展和改进。该标准适用年龄8周岁以上的青少年,考试形式未...