理论教育 Java基础:穷举算法的使用与限制

Java基础:穷举算法的使用与限制

时间:2023-11-20 理论教育 版权反馈
【摘要】:穷举算法是最简单的一种算法,它对所有可能的解按某种顺序进行逐一枚举、查找和检验,从中找出符合结果要求的问题的解。穷举算法最简单,效率也最低。但对于许多毫无规律的问题,穷举法用通过低效的运算,可以得到最准确最全面的解。比如密码的破解,通常没有任何已知条件或极少的已知条件,这时就可以采用穷举法进行破译。使用穷举法,应该尽可能使用条件,以减少计算量。

Java基础:穷举算法的使用与限制

穷举算法是最简单的一种算法,它对所有可能的解按某种顺序进行逐一枚举、查找和检验,从中找出符合结果要求的问题的解。穷举算法最简单,效率也最低。但对于许多毫无规律的问题,穷举法用通过低效的运算,可以得到最准确最全面的解。比如密码的破解,通常没有任何已知条件或极少的已知条件,这时就可以采用穷举法进行破译。

使用穷举法,应该尽可能使用条件,以减少计算量。

【例9-1】求水仙花数。所谓的水仙花数,就是一个3位数的整数,与该数各位的三次方和相等。例如:153=13+53+33

程序思路:对于3位数的整数,应该穷举的数值范围是100~999。同时,还要将这3位整数的个、十、百位进行分解。假设i为100~999之间的整数,则其百位的值i2为i/100;十位的值i1为i/10%10;个位的值i0为i%10,并且需要符合条件:(i2)3+(i1)3+(i0)3==i。

程序运行结果:

153 370 371 407

【例9-2】将一张面值为100元的人民币等值换成100张5元、1元和5角的零钞,要求每种零钞不少于1张,问有哪几种组合?(www.daowen.com)

程序思路:因为每种钞票最少一张,所以5元钞票的可能的张数y5有1~19张、1元钞票的可能的张数y1有1~95张,而5角的钞票的张数y0则为100-y5-y1张。3种钞票的组合需要满足条件y5*5+y1*1+y0*0.5==100。

程序运行结果:

【例9-3】将1,2,3,…,9共9个数分成3组,分别组成3个3位数,且使这3个3位数构成1∶2∶3的比例。例如,192∶384∶576=1∶2∶3。其中192,384,576这3个数包含1~9每个数。

程序思路:因为所组成的数为3位数,且每个数的各位都不相同,3个数有x∶y∶z=1∶2∶3的关系。y=2*x,z=3*x,且x最小,所以x的穷举取值范围是123~321。为保证1~9每个数字在3个数中只能使用一次,使用整型数组n[]来统计各个数的使用次数。如n[1]记录数字1被使用的次数,n[2]记录数字2被使用的次数,……,n[9]记录数字9被使用的次数。当n[i]>1时,表示数字i被重复使用,本次所求的数值不符合条件。

程序运行结果:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈