枚举-算法

来源:互联网 发布:东莞天行健网络怎么样 编辑:程序博客网 时间:2024/05/19 05:34

枚举

求解策略:
它是基于已有知识进行的一种答案猜测的一类问题思想

例如:求小于N的最大素数

有以下一个问题:
1.找不到一个数学公式,直接就去求出最大小于N的最大素数。

2.我们可以这样思考:N-1是素数吗? N-2是素数吗? ......一直到找到这个数为止,(这个过程我们在不断的猜想,不断 地将每一种情况考虑,这就是枚举的策略)假设这个数是N-k;

3.在上面的过程中又需要思考一个问题问题:

N-K是素数的条件(也就是我们是怎么知道N-K是素数的,N-k这个数就是根据我们自己已经掌握的知识进行筛选出来的结果:):

大于2小于根号(N-K)的数都不能被整除的数就是素数;

解决办法

1.从N这个数开始判断是不是素数;根据素数的条件判断;

2.如果是就输出这个值;不是,就将这个数减1,再重复上面的操作;

#include<iostream>#include<cmath>using namespace std;int main(){    int N = 100;//假设N是100    N = N-1;//保证N是小于100的数;    while(N>=1){int flag = 1;//一开始假设就是标记是素数if(N%2 == 0)//可以根据自己的知识提前判断是不是素数(偶数一定不是素数)    {        N = N-1; continue;}               for(int i = 2;i<sqrt(N);i++){            if(N%i == 0)                {                flag = 0;//标记不是素数; break;                }        }        if(flag == 1)            {cout <<N<<endl;break;}        N = N-1;    }



枚举的思想: 猜测

枚举

从可能的集合中一 一列举各元素
根据所知道的知识,给每一个猜测的答案判断是不是所需;

枚举过程

判断猜测的答案是否正确

N-1是小于N的最大素数吗?

进行的猜测时,猜测的结果必须是已经进行判断是不是素数

猜测的过程中要及早排除错误的答案.如: 只有奇数才可能是素数

枚举中三个关键问题

问题一

给出解空间,建立简洁的数学模型



问题二

减少搜索的空间

利用知识缩小模型中各变量的取值范围,避免不必要的计算


问题三

采用合适的搜索顺序


说明:关于这个题目有很好的解决方法,这里就是为了讲解枚举这个方法;

关于这个题目的更好方法,可以访问:http://blog.csdn.net/sinapme/article/details/17137761




原创粉丝点击