转自:https://blog.csdn.net/qq_41398448/article/details/80273541
枚举算法的特点
枚举算法的思想是:将问题的所有可能的答案一列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。看下的问题:
找出1~100 之间的素数,需要将1~100 之间的所有整数进行判断。因为枚举算法要列举问题的所有可能的答案,所以应具备以下3 个特点:
(1)得到的结果肯定是正确的。
(2) 可能做了很多的无用功,浪费了宝贵的时间,效率低下。
(3) 通常会涉及求最大值和最小值的问题。
算法思路
枚举法常被称为穷举法,是指从可能的集合中一一枚举各个元素,用题月给定的约束条判定哪些是无用的,哪些是有用的。能使命题成立者即为问题的解。枚毕算法一般使用while循环实现。
采用枝举算法解题的基本思路如下:
采用枝举算法解题的基本思路如下:
(1)确定校举对象、枚举范围和判定条件。 (2)一一枚举可能的解,验证是否是问题的解。
下面将从枚举算法优化、枚举对象选择以及判定条件确定这3个方面来探讨如何用枚举法解题。枚举算法般按照如下3步进行:
枚举值符合给
(1)题解的可能范围,不能遗漏任何一个真正解,也要避免有重复。
(2)判断是否是真正解的条件。
(3)使可能解的范围降至最小,以便提高解决问题的效率。
百钱买百鸡
我国古代数学家在《算经》中有一道题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、维各几何?”意为:公鸡每只5元,母鸡每只3元,小鸡3只1元。用100元买100只鸡,问公鸡,母鸡,小鸡各多少?
- #include<stdio.h>
- void main()
- {
- int x,y,z;
- for(x=0;x<=20;x++){
- for(y=0;y<=33;y++){
- z=100-x-y;
- if(z%3==0&&x*5+y*3+z/3==100)
- printf("公鸡:%d,母鸡:%d,小鸡:%d\n",x,y,z);
- }
- }
- }
填写运算符
在下面的算式中,添加"+" "-" "*" "/" 4个运算符,使等式成立。
算法分析: 上还算式由5 个数字构成,一共需要填入4个运算符。并且每两个数字之间的运算符有4 种选择,分别是“+”、“-”、“*”、“/”。在编程中,可以通过循环来填入各种运算符,然后再判断算式是否成立。需要保证当填入除号时,其右侧的数不可能是0,并且"*”、“/”运算符的优先级高于“+”、“-”。
- #include<stdio.h>
- void main()
- {
- int j,i[5]; //循环变量,数组i用来表示4个运算符
- int sign; //累加运算时的符号
- int result; //保存运算式的结果值
- int count=0; //计算器,统计符合条件的方案
- int num[6]; //保存操作数
- float left,right; //保存中间结果
- char oper[5]={' ','+','-','*','/'};
- printf("请输入5个数:");
- for(j=1;j<=5;j++){
- scanf("%d",&num[j]);
- }
- printf("请输入结果:");
- scanf("%d",&result);
- for(i[1]=1;i[1]<=4;i[1]++){ //循环4种运算符,1表示+,2表示-,3表示*,4表示/
- if((i[1]<4)||(num[2]!=0)){ //运算符若是/,则第二个运算符不能为0
- for(i[2]=1;i[2]<=4;i[2]++){
- if((i[2]<4)||(num[3]!=0)){
- for(i[3]=1;i[3]<=4;i[3]++){
- if((i[3]<4)||(num[4]!=0)){
- for(i[4]=1;i[4]<=4;i[4]++){
- if((i[4]<4)||(num[5]!=0)){
- left=0;
- right=num[1];
- sign=1;
- for(j=1;j<=4;j++){
- switch(oper[i[j]]){
- case '+':
- left=left+sign*right;
- sign=1;
- right=num[j+1];
- break;
- case '-':
- left=left+sign*right;
- sign=-1;
- right=num[j+1];
- break;//通过f=-1实现减法
- case '*':
- right=right*num[j+1];
- break; //实现乘法
- case '/':
- right=right/num[j+1]; //实现除法
- break;
- }
- }
- if(left+sign*right==result)
- {
- count++;
- printf("%3d: ",count);
- for(j=1;j<=4;j++){
- printf("%d%c",num[j],oper[i[j]]);
- }
- printf("%d=%d\n",num[5],result);
- }
- }
- }
- }
- }
- }
- }
- }
- }
- if(count==0){
- printf("没有符合要求的方法!\n");
- }
- }