穷举算法及解题
算法——穷举法
算法——穷举法穷举法是一种常见的求解问题的算法,也被称为暴力搜索或者暴力枚举。
它的基本思想是穷尽所有可能的情况,从中找出满足问题要求的最优解或者符合条件的解。
在实际问题中,穷举法可以解决很多难题,比如寻找最短路径、最小值、最大值等等。
穷举法的求解过程相对容易理解,而且实现起来很简单。
但是,随着问题规模的增加,穷举法的时间复杂度会非常高,计算机的计算能力往往无法承载。
因此,在使用穷举法时,需要掌握一些技巧有效地减少计算量。
穷举法基本步骤:1.确定问题的解空间解空间是指可以取到的所有解组成的集合。
需要明确问题的解空间,方便穷举法从中查找到符合条件的解。
例如,对于求1~100中所有偶数的和这个问题,解空间就是所有偶数的集合{2,4,6,...,100}。
2.确定问题的约束条件约束条件是指解必须满足的限制条件。
例如,对于求1~100中所有偶数的和这个问题,约束条件就是偶数。
3.进行穷举搜索穷举搜索就是从解空间中挨个枚举每一个解,判断是否满足约束条件。
对每一组解都进行判断,找到满足要求的最优解或者符合条件的解。
例如,在求1~100中所有偶数的和这个问题中,需要从所有偶数中挨个枚举每一个偶数,将其累加到结果变量中。
4.分析求解结果分析求解结果,检验是否符合问题的要求。
如果结果合法,那么就是要求的最优解或者符合条件的解。
如果结果不合法,那么需要继续搜索其他可能的解。
穷举法的优缺点优点:1.穷举法可以求解各种难点问题,尤其是在面对离散的问题时效果非常显著。
2.穷举法思路简单,易于理解,实现也相对较简单。
3.穷举法保证能够搜索到所有可能的解,因此能够找到最优解或者符合条件的解。
1.穷举法遍历所有可能的解,当问题规模较大时,时间复杂度非常高,计算量大,效率低。
2.部分问题的解空间很难找到或没有固定的解空间,导致穷举策略无从下手。
3.穷举法没有明确的评估标准,求得的解无法与其他算法进行比较。
穷举法使用技巧1.剪枝技术穷举法的时间复杂度往往比较高,因此需要使用剪枝技术,减少不必要的计算。
基础算法(一)穷举法
基础算法(⼀)穷举法
基础算法(⼀)穷举法
穷举法的基本思想:从可能的解集合中⼀⼀穷举各元素,⽤题⽬给定的检验条件判定哪些是有⽤的,哪些是⽆⽤的,能使命题成⽴的,即为其解。
穷举法解题思路:
1、对命题建⽴正确的数学模型;
2、根据命题确定数学模型中各变量的变化范围(即可能解的范围);
3、利⽤循环语句、条件判断语句逐步求解或证明。
穷举法的特点:
算法简单,但运算量⼤。
对于可能确定解的范围,⼜⼀时找不到更好的算法时,可以采⽤穷举法。
例1、求满⾜表达式A+B=C的所有整数解,其中A、B、C为1~3之间的整数。
例2、鸡兔同笼问题(在同⼀个笼⼦⾥有鸡和兔⼦若⼲只,从上⾯看,能看到20个头,从下⾯看,能看到60只脚,问鸡兔各有多少只?)例3、百钱百鸡问题(⼀百块钱要买⼀百只鸡,这⼀百只鸡必须包含母鸡、公鸡和⼩鸡,其中,公鸡5元⼀只,母鸡3元⼀只,⼩鸡1元三只,
问有哪些购买⽅案?)
例4、⽔仙花数问题(ABC=A3+B3+C3,列出所有的整数ABC)
在⽤穷举法时,问题必须满⾜两个条件:
1、能够预先确定可能解的个数;
2、对每个解变量的取值,其变化范围也能预先确定。
使⽤穷举法时应注意的问题:
1、减少穷举变量;
2、缩⼩穷举变量的取值范围。
穷举法-计算机求解问题的一种方法
穷举法——计算机求解问题的一种方法概述所谓穷举法,就是在列举所有可能的解,逐一检验直至找到真正的解。
例如,“找出整数n的所有因子”这一问题就可以采用穷举法。
所有可能的解(即因子)落在集合{1, 2, 3, …, n}内,分别用n除一除,余数为0则是因子,否则不是因子。
银行卡密码是6位数字,采用穷举法破解就是把所有6位数都试一遍,那一共要试106次。
人来试是受不了的,而计算机也许可以(因为速度更快)。
所谓暴力破解法正是这样做的。
例一题目:一个首项大于0的递增等差数列前四项和为26,前四项积为880,求该数列的第20项的值。
提示:如果一个数列从第二项起,每一项与它的前一项的差等于同一个常数,这个数列就叫做等差数列,这个常数叫做等差数列的公差。
例如:等差数列:1,3,5,7,9,11。
该数列的公差是2,第5项值是9。
采用穷举法解题说明如下。
假设数列首项为a,差值为d,有:a+ a+d + a+2d + a+3d = 26a*(a+d) * (a+2d)*(a+3d) = 880如何求出a和d?答:穷举(a,d)的组合。
数列首项a从1穷举到5,差值d可从1穷举到5。
a从1开始是因为题目指出首项大于0,a到5为止是因为数列前4项之和为26,而4*5+6*1(差值d至少为1)等于26。
差值d从1开始是因为是等差数列,差值至少为1,到5为止的因为6*5>26。
这样,构造出了所有可能的解,即(a,d)的组合:(1, 1),(1, 2), (1, 3), (1, 4), (1, 5), (2, 1),(2,2),(2,3),(2,4),(2,5)…(5,1), (5,2),(5,3),(5,4),(5,5)。
算法描述如下:for a=(1,2,3,4,5):for d=(1,2,3,4,5):如果a+ a+d + a+2d + a+3d等于26且a*(a+d) * (a+2d)*(a+3d)等于880,则:求得数列第20项是a+19*d;算法结束。
穷举法研究
穷举算法探究报告
一、穷举算法原理介绍
穷举法的基本思想是根据题目的部分条件拟定答案的大致范畴,并在此范畴内对全部可能的状况逐个验证,直到全部状况验证完毕。
若某个状况验证符合题目的全部条件,则为本问题的一种解;若全部状况验证后都不符合题目的全部条件,则本题无解。
穷举法也称为枚举法。
用穷举法解题时,就是按照某种方式列举问题答案的过程。
针对问题的数据类
型而言,惯用的列举办法一有以下三种:
(1)次序列举是指答案范畴内的多种状况很容易与自然数对应甚至就是自然数,能够按自然数的变化次序去列举。
(2)排列列举有时答案的数据形式是一组数的排列,列举出全部答案所在
范畴内的排列,为排列列举。
(3)组合列举当答案的数据形式为某些元素的组合时,往往需要用组合列举。
组合是无序的
二、程序设计流程。
取数之递归算法、回溯算法、穷举算法
取数之穷举算法、递归算法一、穷举搜索法穷举搜索法是穷举所有可能情形,并从中找出符合要求的解。
穷举所有可能情形,最直观的是联系循环的算法。
[例]找出n个自然数(1,2,3,…,n)中r个数的组合。
例如,当n=5,r=3时,所有组合为:543542541532531521432431421321total=10 {组合的总数}[解]n个数中r的组合,其中每r 个数中,数不能相同。
另外,任何两组组合的数,所包含的数也不应相同。
例如,5、4、3与3、4、5。
为此,约定前一个数应大于后一个数。
将上述两条不允许为条件,当r=3时,可用三重循环进行搜索。
[程序]Program zuhe11;constn=5;vari,j,k,t:integer;begint:=0;for i:=n downto 1 dofor j:=n downto 1 dofor k:=n downto 1 doif (i<>j)and(i<>k)and(i>j)and(j>k) thenbegint:=t+1;writeln(i:3,j:3,k:3);end;writeln('total=',t);end.或者Program zuhe12;constn=5;r=3;vari,j,k,t:integer;begint:=0;for i:=n downto r dofor j:=i-1 downto r-1 dofor k:=j-1 downto 1 dobegint:=t+1;writeln(i:3,j:3,k:3);end;writeln('total=',t);end.这两个程序,前者穷举了所有可能情形,从中选出符合条件的解,而后者比较简洁。
但是这两个程序都有一个问题,当r变化时,循环重数改变,这就影响了这一问题的解,即没有一般性。
但是,很多情况下穷举搜索法还是常用的。
穷举法算法案例
穷举法算法案例穷举法,又称为暴力搜索或者暴力破解,是一种简单直接的算法,它通过尝试所有可能的情况来寻找问题的解。
虽然在某些情况下效率不高,但在一些小规模问题或者需要精确解的情况下,穷举法仍然是一个有效的解决方案。
下面我们将通过几个案例来了解穷举法的具体应用。
案例一,寻找素数。
素数是指除了1和自身外没有其他因数的自然数,例如2、3、5、7等。
我们可以通过穷举法来寻找一定范围内的所有素数。
具体做法是从2开始,依次判断每个数是否能被2到该数平方根之间的所有数整除,如果不能则该数是素数。
这种方法虽然效率不高,但对于小范围内的素数搜索是可行的。
案例二,密码破解。
在密码学中,穷举法常常被用来破解简单的密码,例如暴力破解4位数字密码。
假设密码由0-9的数字组成,那么一共有10000种可能的密码组合。
通过穷举法,我们可以依次尝试每一种组合,直到找到正确的密码。
当然,对于更复杂的密码,穷举法可能需要花费更长的时间,但在一些情况下仍然是有效的。
案例三,旅行推销员问题。
旅行推销员问题是一个经典的组合优化问题,假设有n个城市,推销员需要从某个城市出发,经过每个城市一次,最终回到出发的城市,要求找到一条最短的路径。
穷举法可以用来解决这个问题,具体做法是列举出所有可能的路径,计算它们的长度,最终找到最短的路径。
虽然对于大规模的问题来说,穷举法并不是最优的解决方案,但在小规模问题上仍然是可行的。
总结。
穷举法作为一种简单直接的算法,在一些情况下仍然具有一定的应用价值。
然而,需要注意的是,穷举法在处理大规模问题时可能会面临效率低下的问题,因此在实际应用中需要根据具体情况选择合适的算法。
希望通过上述案例的介绍,能够让大家对穷举法有一个更加深入的了解。
c语言穷举法经典例题
c语言穷举法经典例题穷举法是一种常用的计算机算法,用于遍历所有可能的解决方案以找到最佳解决方案。
在C语言中,穷举法经常被用来解决一些经典的例题。
本文将介绍三个常见的C语言穷举法经典例题,并给出相应的解决方法。
1. 例题一:找出100以内的所有素数要求:编写一个程序,找出100以内的所有素数。
解决思路:穷举法通过考察每个数,判断其是否满足某个条件,来找出符合条件的解。
对于找素数的问题,我们可以从2开始,逐个判断每个数是否为素数。
如果一个数不是素数,那么它一定可以被一个小于它的数整除。
因此,我们可以用两个循环来实现穷举法的思想。
```c#include <stdio.h>int main() {int i, j;for (i = 2; i <= 100; i++) {int isPrime = 1; // 假设当前数为素数for (j = 2; j < i; j++) {if (i % j == 0) {isPrime = 0; // 当前数不是素数break;}}if (isPrime) {printf("%d ", i);}}return 0;}```以上代码中,外层循环遍历从2到100的所有数,内层循环用来判断当前数是否为素数。
如果当前数能够被除1和自身以外的数整除,则将isPrime标记为0,表示不是素数。
最后,打印出所有素数的值。
2. 例题二:猜数字游戏要求:编写一个猜数字的游戏,随机生成一个1到100的整数,玩家通过输入数字来猜测,直到猜中为止,给出总共猜了多少次。
解决思路:穷举法可以通过循环来逐个尝试所有可能的选择,直到找到解决方案。
对于猜数字游戏,我们可以利用rand()函数来生成一个伪随机数字,并与玩家的猜测进行比较,直到猜中为止。
```c#include <stdio.h>#include <stdlib.h>#include <time.h>int main() {srand(time(0)); // 初始化随机数生成器int target = rand() % 100 + 1; // 生成1到100之间的随机数int guess, count = 0;do {printf("请输入你猜测的数字:");scanf("%d", &guess);if (guess > target) {printf("太大了!\n");} else if (guess < target) {printf("太小了!\n");}count++;} while (guess != target);printf("恭喜你,猜对了!总共猜了%d次。
c语言穷举法经典例题
c语言穷举法经典例题一、引言穷举法是一种常见的编程方法,通过逐个测试所有可能的选项,以确定满足特定条件的解决方案。
这种方法在许多问题中都有应用,例如数独、斐波那契数列、判断一个数是否为素数等。
本篇文章将介绍几个C语言中的经典穷举法例题,帮助您更好地理解这一方法的应用。
二、经典例题1. 数独求解问题描述:给定一个9x9的数独网格,要求找出满足规则的所有解。
规则为每个数字只能出现一次。
代码实现:```c#include <stdio.h>#include <stdlib.h>int main() {int board[9][9]; // 数独网格int i, j;int solutions = 0; // 记录解的数量// 穷举所有可能的情况for (i = 0; i < 9; i++) {for (j = 0; j < 9; j++) {// 逐个尝试数字1到9board[i][j] = 1 + rand() % 8; // 使用随机数字以增加难度 // 检查当前数字是否满足规则for (int k = 0; k < i * 3 + j * 3 + 1; k++) { // 检查周围3x3的格子是否有重复数字if (board[i + k / 3][j + k % 3] == board[i][j]) { // 检查上方是否有重复数字board[i][j] = -1; // 如果重复则标记为无效数字,跳过下一个循环break;}}if (board[i][j] != -1) { // 如果当前数字满足规则,则增加解的数量并继续下一个循环solutions++;}}}// 输出解的数量并结束程序printf("Number of solutions: %d\n", solutions);return 0;}```这段代码通过穷举所有可能的情况,检查每个数字是否满足规则,最终找到所有符合规则的解。
穷举法(枚举法)
一、穷举法(枚举法)列出问题的全部可能解,然后找到最佳解例:设有A、B、C、D四个数都在1~16范围内。
要求打印出四个数都不相同时,其和为34的所有值。
•算法分析:最直接的想法是设置A、B、C、D四个变量,都从1至16循环。
但这需要164次循环,而且循环中还必须判断A、B、C、D四数有所重复的情况。
我们可以加上一定的限制条件A≠B≠C≠D,设A<B<C<D,这样可以设A的初值为1,B的初值为A+1,C的初值为B+1,D的初值为C+1。
每一个循环的终值(可能的最大数)我们也可以计算出来。
A + A+1 + A+2 + A+3 = 34,故A=7;1 + B + B+1 + B+2 = 34,故B=10;1 +2 + C + C+1 = 34,故C=15;D=C+1,故D=16。
函数如下:void fournums() {int a, b, c, d ;for (a = 1; a<=7; a++)for (b = a+1; b<=10; b++)for (c = b+1; c<=15; c++)for (d = c+1; a<=16; d++)if (a+b+c+d == 34)cout << “A=”<< a << “B=”<< b << “C=”<< c << “D=”<< d <<”\n”; }二、贪心法当一个问题的状态空间很大时,穷举法计算量可能会太大。
当人们面对一个问题时,可能会采取目前看来最接近解状态的选择方案。
•有时运用最直接的方法,可能会得到很好的效果。
•《C程序设计选讲》背包问题•Huffman树贪心法一般原则贪心法把构造可行解的工作分阶段来完成。
在各个阶段,选择那些在某些意义下是局部最优的方案,期望各阶段的局部最优的选择带来整体最优。
4.2.1用穷举法求解问题的基本过程
3.2 用穷举法解决问题
茂名市电白区第一中学 陈伟锋
情景体验
怎么办?
小明同学忘记了电脑的开机密码(6位纯数字) ?
穷举法
在一定的可能范围内,逐个搜索问题的解决方案,直到 搜索到或搜索遍可能范围为止。
任务描述
高二(3)班同学,准备要用100元班会费给 福利院的小朋友购买100份小礼品。选定了小玩 偶(5元/个)、小风车(3元/个) 和卡通卡(1元/3个) 三类商品。
穷举算法两大要素: 1.穷举变量及范围 2.穷举条件
开始
x=x+1
x=0 否
x≤100 是
y=0
否 y≤100 是 z=01
y=y+1
否 z≤300
是
条件1 否 条件2
是
输出x,y,z
z=z+1
结束
3.编写程序
开始
x=x+1
x=1 否
x≤100 是
y=1
否 y≤100 是
z=1
y=y+1
否 z≤300
Next x
思考: 1.一共循环了几次? 2.是否可以减少循环次数?
5.优化算法
x,y 变量范围是 否可变小?
小玩偶(5元/个)、小风车(3元/个) 、卡通卡(1元/3个),共花100元
小小玩玩偶偶::x(1x(≤1≤x≤x1≤0200))
小小风风车车::y(y1(≤1y≤≤y1≤0303))
卡卡通通卡卡::z(1z(≤1z≤≤z3≤0300)0)
是
条件1 否 条件2
是
输出x,y,z
z=z+1
结束
For x = 0 To 100 For y = 0 To 100 For z = 0 To 100
用穷举法设计算法
开始
j←1 j≤9
N 结束 N Y
i←1 i≤9
Y
n←j*10+i
输出n i← i +1 j← j +1
问题4:打印输出由1、2……8、9这九个数 字组成的所有可能的二位数n。
#include<cstdio> using namespace std; int main() { int i,j; for (i=1;i<=9;i++) { for (j=1;j<=9;j++) { printf("%d\n",i*10+j); } } return 0; }
#include<cstdio> using namespace std; int main() { int x,y,z; for(x=0;x<=14;x++) for(y=0;y<=25;y++) if(7*x+4*y==100) { z=100-x-y; printf("x=%d,y=%d,z=%d\n",x,y,z); } x=0,y=25,z=75
【例5】:(百钱买百鸡问题)大约在公元5世纪,数学家张 邱建在他的《算经》中提出了一个闻名于后世的百钱百鸡问 题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一, 百钱买百鸡,翁、母、雏各几何?
1.算法分析与设计 (1) 以三种鸡的个数为枚举对象,分别设为x,y,z。根据题 意,可以列出下面的不定方程
用穷举法设计算法
问题1: 有一把锁和一串钥匙(共有10把钥匙), 怎样找出所有开这把锁的钥匙?
用穷举法设计算法
穷举算法的概念: 穷举算法就是按问题本身的性质,通过多 重循环一一列举出该问题所有可能的解(不能 遗漏,也不能重复),并在逐一列举的过程中, 检验每个可能的解是否是问题的真正解,若是, 我们采用这个 复),检验每个可能的解。
特殊解题方法——穷举法
特殊解题方法——穷举法解答某些数学题,可以把问题所涉及到的数量或结论的有限种情况,不重复不遗漏地全部列举出来,以达到解决问题的目的。
这种解题方法就是穷举法。
例1 从甲地到乙地有A、B、C三条路线,从乙地到丙地有D、E、F、G四条路线。
问从甲地经过乙地到达丙地共有多少条路线?(如图3.28)分析:从甲地到乙地有3条路线,从乙地到丙地有4条路线。
从甲地经过乙地到达丙地共有下列不同的路线。
解:3×4=12答:共有12条路线。
例2 如果一整数,与1、2、3这三个数,通过加减乘除运算(可以添加括号)组成算式,能使结果等于24,那么这个整数就称为可用的。
在4、5、6、7、8、9、10、11、12这九个数中,可用的有_______个。
(1992年小学数学奥林匹克初赛试题)分析:根据题意,用列式计算的方法,把各算式都列举出来。
4×(1+2+3)=24 (5+1+2)×3=246×(3+2-l)=24 7×3十豆十2—248×3×(2-1)=24 9×3—1—2—2410×2+l+3=24 11×2+3-l=2412×(3+1-2)=24通过计算可知,题中所给的9个数与1、2、3都能够组成结果是24的算式。
答:可用的数有9个。
例3 从0、3、5、7中选出三个数字能排成_______个三位数,其中能被5整除的三位数有_________个。
(1993年全国小学数学竞赛预赛试题)分析:根据题中所给的数字可知:三位数的百位数只能有三种选择:十位数在余下的三个数字中取一个数字,也有3种选择;个位数在余下的两个数字中取一个数字,有2种选择。
解:把能排成的三位数穷举如下,数下标有横线的是能被5整除的。
305,307,350,357,370,375;503,507,530,537,570,573;703,705,730,735,750,753答:能排成18个三位数,其中能被5整除的有10个数。
用穷举法解决问题
b 0 0பைடு நூலகம்
c 0 1
153 1
5
3
999 9
9
9
3.2 用穷举法解决问题 一、什么是穷举法
穷举法又称枚举法、列举法,它将求解对象一一列举出来,然后逐一加以分 析、处理,并验证结果是否满足给定的条件,穷举完所有对象,问题将最终 得以解决。
方法一: For I=100 to 999 A=int(I/100) B=int(I/10) mod 10 C=I mod 10
二、用穷举法解决问题的步骤
1、确定问题解可能搜索的范围:用循环或嵌套来实现) 2、写出符合问题解的条件:用if语句实现 3、尽可能地缩小搜索的范围,减少程序运行时间,提高程序的执行效率。 例:公元前5世纪,我国数学家张丘建在《算经》一书中提出了一个“百钱买 百鸡问题”。问题如下:鸡翁一值钱5,鸡母一值钱3,鸡雏三值钱1。百钱买 百鸡,问鸡翁、鸡母和鸡雏各几何?
方法二: For a=1 to 9 for b=0 to 9 for c=0 to 9 if a^3+b^3+c^3=a*100+b*10+c then print a*100+b*10+c endif next c next b next a
If a^3+b^3+c^3=I then print I Next I
例3:生活中的问题 某同学用自己的QQ号登录,可他记不清密码了,你能帮 他找回密码吗?他的密码是一个5位数,67□□8,其中 百位和十位上的数字他不记得了,但他还记得该数能够 被78整除,也能被67整除。你能帮他设计一个算法求出 该密码吗?
(1)判断下列两题能否用穷举算法解决,为什么? ①在一个直角三角形中,三条边a、b、c的长度都为整 数,且一条直角边a的长度已确定,斜边c的长度不能超过 某数I,找出满足条件的所有直角三角形。 ②使用一根长度为L厘米的铁丝,制作一个面积为S的 矩形框,要求,计算出满足这种条件的矩形的高h和宽w。 ③《孙子算经》中有许多有趣的数学题,“鸡兔同笼” 问题就是一个典型的例子。原题是:“今有鸡兔同笼,上 有三十五头,下有九十四足,问鸡兔各几何?”
4.2.1用穷举法求解问题的基本过程
y ←y+1
x ←x+1 结束
程序代码: For x=1 To 20
For y=1 To 33 z=100-x-y If x*5+y*3+z/3=100 Then
Print x,y,z End If Next y Next x
穷举算法
Exhaustive Attack method
04
穷举算法 生活实例 算法设计 课堂练习
小结
1.枚举算法的概念 2.枚举算法的结构特征
3.枚举算法的设计步骤
4.枚举算法的应用
1、穷举法解决问题的思路:依据题目的已知条件,确定答案的大致范围,在此范围内进行穷举。 2、穷举法解决问题的关键:(1)确定问题解的可能搜索的范围:用循环或循环嵌套结构实现;
(2)写出符合问题解的条件; (3)能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。
End If x=x+1 Loop
算法设计(2)
程序代码:
For a=1 To 9 For b=0 To 9 For c=0 To 9 If a*100+b*10+c=a^3+b^+c^ Then Print a*100+b*10+c End If Next c Next b
Next a
算法设计(3)
算法设计(2)
若一个三位数X=100a+10b+c(a、b、c都是个位数),满足 a3+b3+c3=X,则X称为水仙花数,请设计算法,找出所有的水 仙花数。
研究范围 100 <= X <= 999
列举 分别得到三位数的百位a、十位b、个位c
检验
算法实验1穷举【参考答案】【最新完全版】
算法分析与设计实验一——穷举算法(黑体,三号)1.穷举简介(小标题:黑体,小四;内容:宋体,五号)穷举法又称列举法,其基本思想是逐一列举问题所涉及的所有情况。
从中寻找满足条件的结果。
适用于数量较小的问题。
2.算法流程或设计思想穷举通常应用循环结构来实现。
在循环体中,应用选择结构实施判断筛选,求得所要求的解。
使用穷举法的关键是要确定正确的穷举的范围。
3.分析算法的时间复杂度4.程序设计中的问题及解决方案5.运行说明(包括实验数据和结果说明)6.主要程序代码(添加程序注释)7.对比解决该问题的其他算法(选作)题目:1.有一堆零件(1000-5000个之间),如果以4个零件为一组进行分组,则多2个零件;如果以7个零件为一组进行分组,则多3个零件;如果以9个零件为一组进行分组,则多5个零件。
编程求解这堆零件总数。
参考答案:#include<stdio.h>void main(){int n,count=0;for(n=1000;n<=5000;n++)if(n%4==2&&n%7==3&&n%9==5){printf("%d ",n);count=count+1;if(count%5==0)printf("\n");}printf("\ncount = %d\n",count);}2.穷举三位数的水仙花数。
水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。
(例如:13 + 53 + 33 = 153)参考答案:/*2. 穷举三位数的水仙花数。
水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。
(例如:13 + 53 + 33 = 153)*/#include <stdio.h>void main(){int a,b,c,d;for(a=100;a<=999;a++){b=a/100;c=a/10-b*10;d=a-b*100-c*10;if(b*b*b+c*c*c+d*d*d==a)printf("%d = %d^3 + %d^3 + %d^3\n",a,b,c,d);}}3.穷举真分数递增序列中的第k项的值。
穷举法
穷举法
四、穷举法应用
begin e:=15-a-b-c-d;b0:=(e<>2) and (e<>3);
m:=bton(e=1)+bton(b=2)+bton(a=5)+bton(c<>1)+bton(d=1);
b0:=b0 and (m=-2); b1:=(e=1) and (a<>2); b1:=b1 or (a=5) and(c<>1) and(c<>2); b1:=b1 or (c<>1) and (d<>1) and (d<>2); b1:=b1 or (d=1) and (e<>2); b0:=b0 and not b1; if b0 then
穷举法
四、穷举法应用
分析:本题是一个逻辑判断题,一般的逻辑判断题都采 分析:本题是一个逻辑判断题, 用穷举法进行解决。 我们对5 用穷举法进行解决 。 我们对 5 所学校所得名次的各种可 能情况进行穷举。在每种情况中, 能情况进行穷举。在每种情况中,为了防止不同学校取 相同的名次,设立了逻辑数组x x[I]为false表示已有 相同的名次,设立了逻辑数组x,x[I]为false表示已有 某校取第I 某校取第I名。 此题的难点在于确定判断条件。我们设立逻辑变量b0来 此题的难点在于确定判断条件。我们设立逻辑变量b 描述这一条件,主要有两个条件: 校不是第2 描述这一条件,主要有两个条件:“E校不是第2名或第 只有第1名和第2 名的学校的人猜对” 3 名 ” 与 “ 只有第 1 名和第 2 名的学校的人猜对 ” , 后一 条件要判断: 是否只有两人说法正确? 条件要判断:1)是否只有两人说法正确?2)说得正确 的人是否是取得第1名和第2名的学校的人? 的人是否是取得第1名和第2名的学校的人?要判断是否 仅有两人说正确,须统计正确命题的个数。为此,设立 仅有两人说正确,须统计正确命题的个数。为此, 了函数bton 将逻辑量数值化。 bton, 了函数bton,将逻辑量数值化。
4.2.1用穷举法求解问题的基本过程
1.If语句和For语句If语句在穷举算法中一般用块结构居多,形式为:If条件Then语句块1Else语句块2′Else语句可以没有End IfFor语句结构形式为:For循环变量=初值To终值Step步长循环体语句Next循环变量2.穷举算法的基本思想(1)定义:根据求解问题的内容,一一列举出该问题所有可能的情况,并根据限定的条件逐个判断,挑出符合条件的解。
(2)设计穷举算法的要点:正确的解不能遗漏、不能重复,在此前提下供选择判断的范围要可能小。
(3)穷举算法一般结构:For循环嵌套选择语句。
穷举算法中可能的解的范围一般较明确,适合用For语句,关键判断用If语句实现。
3.穷举算法的应用(1)使用穷举算法时,可能解的范围是非常明确的,可能解的个数也是有限的,否则无法用此算法。
(2)穷举算法应用举例:猜密码、寻找有特定要求的数字、最优方案等。
例1以下问题不适合穷举算法的是()A.破解qq密码B.有一批玩具要装箱,大小两种规格的箱子分别需要几个,寻找可能的方案C.打牌时,根据自身与对手的牌,寻找合理的打法D.求解高数的方程组例2老马准备把500元钱全部花完去买若干只小鸡和小鸭,已知小鸡每只10元,小鸭每只15元,他想每种至少买10只,问有几种具体方案?程序如下,在划线处填上合适代码。
Private Sub Command1 Click()Dim a As Integer,b As Integer′a为小鸡数,b为小鸭数For a =10 To 35′小鸡至少10只For b =10 To ①If ②ThenPrint a,bEnd IfNext bNext aEnd Sub一、基础巩固1.有如下程序段,运行后c的值为()c=0For i=1 To 16 Step 2If i Mod 3=0 Thenc=c+1End IfNext iA.2 B.3 C.5 D.82.寻找满足如下要求的三位正整数:个十百三位的数字之和不超过8,这个数字能被8整除,则以下范围中最合适的是()A.[100,999]B.[100,800] C.[108,500]D.[108,900]二、能力提升3.2008年是北京奥运,每隔4年举办,下列程序寻找2017~2116这100年间的奥运年,并且这个年份个位数和十位数之和等于10。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
穷举算法及解题
穷举算法及解题
例12-1 古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、
2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2~1000内的所有完全数。
问题分析
(1)本题是一个搜索问题,搜索范围2~1000,找出该范围内的完全数;
(2)完全数必须满足的条件:因子的和等于该数的本身;
(3)问题关键在于将该数的因子一一寻找出来,并求出因子的和:分解因子的方法比较简单,采用循环完成分解因子和求因子的和。
程序如下:
program p12_1;
var a,b,s:integer;
begin
for a:=2 to 1000 do
begin
s:=0;
for b:=1 to a-1 do
if a mod b =0 then s:=s+b;
if a=s then begin
write(a,'=',1,);
for b:=2 to a-1 do
if a mod b=0 then write('+',b);
writeln;
end;
end;
end.
当程序运行后,输出结果:
6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248
例12-3
邮局发行一套票面有四种不同值的邮票,如果每封信所帖邮票张数不超过三枚,存在整数r,使得用不超过三枚的邮票,可以贴出连续的整数1、2、3、……、r来,找出这四种面值数,使得r值最大。
问题分析:本题则是
知道每封信邮票数的范围(<=3),邮票有四种类型,编程找出能使面值最大邮票。
其算法是:
(1) 面值不同的四种邮票,每封信所贴邮票不超过3张;
(2) 用这四种邮票贴出连续的整数,并且使r值最大;
(3) 用穷举法,找出所有符合条件的解;
(4) 本题用集合的方法统计邮票的面值,提高判重的速度。
设四种邮票的面值分别为:a,b,c,d,根据题意设:
a<b<c<d,因此a=1,用循环语句完成搜索。
Program p12-3;
Var a,b,c,d:integer;
X,x0,x1,x2,x3,x4:integer;
st1:set of 1..100;
function number(a,b,c,d:integer):integer;
var n1,n2,n3,n4,sum:integer;
begin
st1:=[];
for n1:=0 to 3 do
for n2:=0 to 3-n1 do
for n3:=0 to 3-n1-n2 do
for n4:=0 to 3-n1-n2-n3 do
begin
if n1+n2+n3+n4<=3 then
begin
sum:=n1*a+n2*b+n3*c+n4*d;
st1:=st1+[sum];
end;
end;
sum:=1;
while sum in st1 do
sum:=sum+1;
number:=sum-1;
end;
begin
a:=1;x0:=0;
for b:=a+1 to 3*a+1 do
for c:=b+1 to 3*b+1 do
for d:=c+1 to 3*c+1 do
begin
x:=number(a,b,c,d);
if x>x0 then
begin
x0:=x;x1:=a;x2:=b;x3:=c;x4:=d;
write(x1:5,x2:5,x3:5,x4:5);
writeln(‘’:10,’x0=’,x0);
end;
end;
end.
程序运行后,其输出结果是:
1 2 3 4 x0=12
1 2 3 5 x0=13
1 3 6 10 x0=23
1 4 7 8 x0=24
穷举法编程练习题目:
1、有一群鸡和一群兔,它们的只数相同,它们的脚数都是三位数,且这两个三位数的数字分别是0,1,2,3,4,5。
问鸡和兔的只数各是多少?它们的脚数各是多少?-穷举法
2、有一个三位数,个位数字比百位数字大,而百位数字又比十位数字大,并且各位数字之和等于各位数字相乘之积,求此三位数。
分析:如果以A、B、C分别表示这个三位数的百位、十位和个位数字,由题意知B<A<C,由此做穷举
3、蜘蛛有8条腿,蜻蜓有6条腿和2对翅,蝉有6条腿和1对翅。
三种虫子共18共,共有118条腿和20对翅。
问每种虫子各几只?
4、甲、乙两数的和为168,甲数的八分之一与乙数的四分之三的和为76,求甲、乙两数各是多少?
5、我国古代数学问题:1兔换2鸡,2兔换3鸭,5兔换7鹅。
某人用20只兔换得鸡、鸭、鹅共30只,问其中鸡、鸭、鹅各几只?源程序:
鸡兔问题:用穷举法,找出满足条件的鸡的脚数和兔的脚数,
其鸡的脚数百十个位上分别为a,b,c,其兔的脚数百十个位上分别为d,e,f,鸡的只数为x,兔的只数为y.为了减少循环判断的次数,我们把0-5各位数字都加上1变成1-6,所以在由各位数字组成脚数x,y时需要减去111。
program jitu;
var
a,b,c,d,e,f,x,y:integer;
begin
for a:=2 to 6 do
for b:=1 to 6 do
for c:=1 to 6 do
for d:=2 to 6 do
for e:=1 to 6 do
begin
f:=21-a-b-c-d-e;
if a*b*c*d*e*f=720 then
begin
x:=100*a+10*b+c-111;
y:=100*d+10*e+f-111;
if (2*x=y) and (x / 2=trunc(x /2)) then
writeln(x div 2,' ',x,' ',y)
end;
end;
end.
数字问题:分析:如果以A、B、C分别表示这个三位数的百位、十位和个位数字,由题意知B<A<C,由此做穷举program geshibai;
var
a,b,c:integer;
begin
for b:=1 to 7 do
for a:=b+1 to 8 do
for c:=a+1 to 9 do
if a+b+c=a*b*c then
writeln(a*100+b*1
0+c) ;
end. program zhizhu;
var
x,y,z:integer;
begin
for x:=1 to 16 do
for y:=1 to 16 do
begin
z:=18-x-y;
if (8*x+6*y+6*z=118) and (2*y+z=20) then
writeln(x,' ',y,' ',z);
end;
end. program n1n2;
var
x,y:integer;
begin
for x:=1 to 168 do
begin
y:=168-x;
if x/8+y*3/4=76 then
writeln(x,' ',y);
end;
end. program jtye;
var
x,y,z:integer;
begin
for x:=7 to 28 do
for y:=3 to 30-x do
begin
z:=30-x-y;
if x/2+y/3*2+z/7*5=20 then
writeln(x,' ',y,' ',z); end;
end.。