八大算法思想(一)------------------枚举算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32211827/article/details/72970404

一,枚举算法的思想:

1,枚举算法的定义:

在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么该结论是可靠 的,这种归纳方法叫做枚举法。
2,枚举算法的思想是:
将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的,舍弃不合适的。
3,使用枚举算法解题的基本思路如下:
(1)确定枚举对象、范围和判定条件。
(2)逐一枚举可能的解并验证每个解是否是问题的解。
4,枚举算法步骤:
(1)确定解题的可能范围,不能遗漏任何一个真正解,同时避免重复。
(2)判定是否是真正解的方法。
(3)为了提高解决问题的效率,使可能解的范围将至最小,
5,枚举算法的流程图如下所示:
                                       


二,枚举算法实例


例一:百钱买白鸡
1,问题描述:
公鸡每只5元,母鸡每只3元,三只小鸡1元,用100元买100只鸡,问公鸡、母鸡、小鸡各多少只?
2,算法分析:
利用枚举法解决该问题,以三种鸡的个数为枚举对象,分别设为mj,gj和xj,用三种鸡的总数 (mj+gj+xj=100)和买鸡钱的总数(1/3*xj+mj*3+gj*5=100)作为判定条件,穷举各种鸡的个数。


例二:使用枚举法解决“填写运算符问题”
1,问题描述:在下面的算式中,添加“+”、“-”,“*”,“/”,4个运算符,使得这个式子成立。
5  5  5  5  5=5
2,算法分析:
上述式子左侧有5个数字,一共需要4个运算符。根据题目要求,两个数字之间的运算符只能有4中选择。在 具体编程时,可以通过循环来填入各种运算符,然后再判断算式左侧的值是否等于右侧的值。并保证,当填入的 是除号时,则右侧的数不能为0,并且乘除的优先级高于加减的优先级。


三,算法实现:

例一:百钱买白鸡
#include<iostream>
using namespace std;
int main()
{
	int mj=0, gj=0, xj=0;                  //定义变量分别表示母鸡、公鸡、小鸡并初始化
	for (gj = 0; gj <= 20; gj++)		   //公鸡最多可买20个
	{
		for (mj = 0; mj <= 33; mj++)	   //母鸡最多可买33个
		{
			xj = 100 - gj - mj;			   // 三种鸡的总数是100只
			if (xj % 3 == 0 && 5 * gj + 3 * mj + xj / 3 == 100)    // 总花费为100元。
		    printf("公鸡为 %d 只,母鸡为 %d 只,小鸡为 %d 只!\n", gj, mj, xj);
		}
	}
	system("pause");
	return 0;
}

                            

例二:使用枚举法解决“填写运算符问题”

#include<iostream>

int 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_s("%d",&num[j]);
	printf("输入结果:");
	scanf_s("%d",&result);
	//注:这里i[1]代表的第一个运算符的意思,i[1]=1代表第一个运算符是“+”,i[1]=2代表第一个运算符是“减”,i[1]=3代表第一个运算符是“-”,i[1]=4代表第一个运算符是“/”
	//注:这里i[2]代表的第二个运算符的意思,i[2]=1代表第二个运算符是“+”,i[2]=2代表第二个运算符是“减”,i[2]=3代表第二个运算符是“-”,i[2]=4代表第二个运算符是“/”
	//i[3],i[4]依次类推。
	for (i[1]=1; i[1]<=4; i[1]++)    //循环4种运算符,1表示+,2表示-,3表示*,4表示/
	{
		if ((i[1]<4) || (num[2] != 0))	//运算符若是/,则第二个运算数不能为0,(注:“||”是或运算,两个条件至少要有一个成立,即第一个运算符为/时,第二个运算数不为0)
		{
			for (i[2]=1; i[2]<=4; i[2]++)
			{
				if ((i[2]<4)||(num[3]!= 0))		//当第二个运算符为/时,第三个运算数不为0
				{
					for (i[3] = 1; i[3] <= 4; i[3]++)
					{
						if ((i[3] < 4) ||( num[4] != 0))	//当第三个运算符为/时,第四个运算数不为0
						{
							for (i[4] = 1; i[4] <= 4; i[4]++)
							{
								if ((i[4] < 4) || (num[5] != 0))	//当第四个运算符为/时,第五个运算数不为0
								{
									left = 0;
									right = num[1];
									sign = 1;
									//使用case语句,将4种运算符填到对应的空格位置,并进行计算
									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;
										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");
	system("pause");
	return 0;
}



猜你喜欢

转载自blog.csdn.net/qq_32211827/article/details/72970404