一.什么是枚举算法
这种算法是一种通过列举出所有情况解决问题的算法
1.基本思想
枚举算法就是将解空间当中所有的情况全都列出来,进行比较和分析,之后再选出最优解。
那么什么是解空间呢?
解空间可以是一个范围内的所有数字,也可以是在特定条件下的数字。当然解空间还有解空间树,这个就需要利用到之后的回溯了,我们这里先不去讨论这个问题,当前的问题仅局限于除空间树外的所有问题!
2.适用范围
可适用于解空间可穷举,规模较小的一些问题
二.相关习题
1.反倍数
我们先来分析题目,题目要求在给定的范围内,在随机取a,b,c三个数字 看在这个范围内存在几个不是a,b,c的整数倍的数字。然后最后将有几个数字输出来。我们不妨可以先想一下,我们先定义上限(即n),count(即数字的个数)。之后利用一个for循环,遍历从1到n的所有数字,看他们是否是a,b,c的整数倍。如果不是的话,那么就count++;直至遍历完。最后输出count,这就是我们想要的答案。那么问题又来了,这个判断应该怎样判断呢?我们首先想到的肯定是利用if条件语句来实现判断。那么我们可以在主函数for循环当中设置一个if判断语句,这是解题思路。那么if的条件怎么设置呢?解决方法就是在主函数之外设定一个判断函数,如果说这个数字同时不是a,b,c的整数倍,那么,我们可以将函数值输出为1,否则为0.通过这个函数,就得到了判断的条件。这就为本题的解题思路!
下面为代码实现:
#include <stdio.h> #include <stdlib.h> int a,b,c; int test(int x) { if(x%a&&x%b&&x%c) { return 1; } else { return 0; } } int main(int argc, char *argv[]) { int n; scanf("%d",&n); scanf("%d%d%d",&a,&b,&c); int i,count=0; for(i=1;i<=n;i++) { if(test(i)) { count++; } } printf("%d",count); return 0; }
2.特别数的和
我们先来分析题目,题目要求在给定的范围内,取出包含2,0,1,9的数字。算出他们之和。
与上题相同主函数的思路还是一样的,只不过是判断方法有所区别。判断方法是先将数字x拆开,分为个位,十位,甚至是百位。然后通过判断这几位是否是2,0,1,9。如果是的话则输出结果为1,否则为0。那么,应该怎样输出数字的十位,各位呢。我们不妨可以在草稿纸上试验一下,举一个简单的例子23,如果需要取出它的个位数字,需要将其除10取余。再将取余出来的这个数字赋给一个变量,对这个变量进行判断。之后再将得到的除数赋给原来的数字x,利用for循环重复操作。直至条件为0。
下面为代码设计实现:
#include <iostream>
using namespace std;
int test(int x)
{
while(x)
{
int y=x%10;
if(y==2||y==0||y==1||y==9)
{
return 1;
}
x=x/10;
}
return 0;
}
int main()
{
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;++i)
{
if(test(i))
{
sum+=i;
}
}
cout<<sum<<'\n';
return 0;
}
以上为关于枚举算法的基本阐述。宝剑锋从磨砺出,梅花香自苦寒来。在学习算法的道路上,是十分艰巨的。这就需要我们,以及其认真的态度。将算法运用到代码当中,让代码活跃起来!(此外在设计代码的过程当中,主要采用了c语言,如有其他语言的实现,可以分享出来和大家一块交流。)