枚举法的本质就是从全部候选答案中去搜索正确的解,使用该算法须要满足两个条件:
1、能够先确定候选答案的数量。
2、候选答案的范围在求解之前必须是一个确定的集合。
枚举是最简单。最基础。也是最没效率的算法
枚举法长处:
1、枚举有超级无敌准确性。仅仅要时间足够。正确的枚举得出的结论是绝对正确的。
2、枚举拥有天下第一全面性,由于它是对全部方案的全面搜索。所以,它可以得出全部的解。
程序优化:
对于枚举算法,加强约束条件,缩小枚举的范围。是程序优化的主要考虑方向。

实例1:百钱买百鸡

一百个铜钱买了一百仅仅鸡。当中公鸡一仅仅3钱、母鸡一仅仅5钱。小鸡一钱3仅仅,问一百仅仅鸡中公鸡、母鸡、小鸡各多少)
代码:
#include<iostream>
const int COCKPR = 3;
const int HENPR = 5;
const int CHICKS = 3; //原错误const double CHICKPR = 1/3; 1 3 为整形,1/3也为整形所以为0,又一次声明1钱能买3仅仅小鸡
void buyChicken(int money, int chooks);
int main()
{
int money = 100;
int chooks = 100;
buyChicken(money, chooks);
return 0;
}
void buyChicken(int money, int chooks)
{
using namespace std;
int MaxCock = money/COCKPR;
int MaxHen = money/HENPR;
int MaxChick = chooks;
int cock,hen,chick;
int count = 0;
for(cock=0; cock<= MaxCock; cock++)
{
for(hen=0; hen<=MaxHen; hen++)
{
for(chick=0; chick<=MaxChick; chick++)
{
if (0 == chick%3 && cock + hen + chick == chooks && COCKPR*cock + HENPR*hen + chick/CHICKS == money)
cout << "公鸡: " << cock << " 母鸡: " << hen << " 小鸡: " << chick << " 第 " << count << "有结果" <<endl;
count ++;
}
}
}
cout << "总共枚举多少次:" << count <<endl;
}
执行结果:

仅仅对小鸡的数量加入一个最小的起始值
函数里面加 int MinChick = chooks-MaxCock-MaxHen;

把最里层小鸡数量的for循环的起始条件改为小鸡最小值 for(chick=MinChick; chick<=MaxChick; chick++)

运算时间复杂度例如以下。

时间复杂度降低一半。说明对于枚举算法。加强约束条件。缩小枚举的范围,是程序优化的主要考虑方向。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3V1Z2xlMjAxMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

代码例如以下:

#include<iostream>
const int COCKPR = 3;
const int HENPR = 5;
const int CHICKS = 3; //原错误const double CHICKPR = 1/3; 1 3 为整形。1/3也为整形所以为0,又一次声明1钱能买3仅仅小鸡
void buyChicken(int money, int chooks);
int main()
{
int money = 100;
int chooks = 100;
buyChicken(money, chooks);
return 0;
}
void buyChicken(int money, int chooks)
{
using namespace std;
int MaxCock = money/COCKPR;
int MaxHen = money/HENPR;
int MaxChick = chooks;
int MinChick = chooks-MaxCock-MaxHen;
int cock,hen,chick;
int count = 0;
for(cock=0; cock<= MaxCock; cock++)
{
for(hen=0; hen<=MaxHen; hen++)
{
for(chick=MinChick; chick<=MaxChick; chick++)
{
if (0 == chick%3 && cock + hen + chick == chooks && COCKPR*cock + HENPR*hen + chick/CHICKS == money)
cout << "公鸡: " << cock << " 母鸡: " << hen << " 小鸡: " << chick << " 第 " << count << "有结果" <<endl;
count ++;
}
}
}
cout << "总共枚举多少次:" << count <<endl;
}


实例2:填数字游戏

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3V1Z2xlMjAxMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

代码:
#include<iostream>
int main()
{
using namespace std;
int t1,t2,t3,t4,t5;
for (t1=1; t1<=9; t1++)
{
for(t2=0; t2<=9; t2++)
{
for(t3=0; t3<=9; t3++)
{
for(t4=0; t4<=9; t4++)
{
for(t5=0; t5<=9; t5++)
{
if(t5*100000 + t5*10000 + t5*1000 + t5*100 + t5*10 + t5 == t5*t1 + t4*t1*10 + t3*t1*100 + t2*t1*1000 + t1 *t1*10000 )
{
cout << " 算的数值为: " << t1 << " 法的数值为: " << t2 << " 描的数值为: " <<t3 << " 述的数值为: " << t4 << " 题的数值为: " << t5<<endl;
cout << " " << t1 << " " << t2 << " " << t3 << " " << t4 << " " << t5 <<endl;
cout << "X " << t1<<endl;
cout << "________________\n";
cout << " " << t5 << " " << t5 << " " << t5 << " " << t5 << " " << t5 << " " << t5 <<endl;
}
}
}
}
}
}
return 0;
}
执行结果:


数据结构与算法之枚举(穷举)法 C++实现的更多相关文章

  1. 基本算法思想之穷举法(C++语言描述)

    穷举算法(Exhaustive Attack method)是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能性,从而达到求解问题的目的.穷举算法效率不高,但是适应于一些没有规律可循的场 ...

  2. 穷举法、for循环、函数、作用域、斐波那契数

    1.穷举法 枚举所有可能性,直到得到正确的答案或者尝试完所有值. 穷举法经常是解决问题的最实用的方法,它实现起来热别容易,并且易于理解. 2.for循环 for语句一般形式如下: for variab ...

  3. 通过穷举法快速破解excel或word加密文档最高15位密码

    1.打开文件 2.工具 --- 宏 ---- 录制新宏 --- 输入名字如 :aa 3.停止录制 ( 这样得到一个空宏 ) 4.工具 --- 宏 ---- 宏 , 选 aa, 点编辑按钮 5.删除窗口 ...

  4. for循环语句以及迭代法和穷举法

    循环语句: 四要素:初始条件,循环条件,状态改变,循环体 for(初始条件;循环条件;状态改变){ //循环体} 案例1:打印等腰直角三角形和菱形 左上三角 static void Main(stri ...

  5. C#4 for循环 迭代法 穷举法应用

    for()循环. 四要素: 初始条件,循环条件,状态改变,循环体. 执行过程: 初始条件--循环条件--循环体--状态改变--循环条件.... 注意:for的小括号里面分号隔开,for的小括号后不要加 ...

  6. C# for 循环 迭代法 穷举法

    for()循环. 四要素: 初始条件,循环条件,状态改变,循环体. 执行过程: 初始条件--循环条件--循环体--状态改变--循环条件.... 注意:for的小括号里面分号隔开,for的小括号后不要加 ...

  7. 【2-24】for循环嵌套,跳转语句,异常语句,穷举法、迭代法

    For循环嵌套与if嵌套相似,是在for中再套for,其结构如下: For(;;) { For(;;){} }经典题型为打印星星例: Console.Write("请输入一个奇数:" ...

  8. C# 异常语句 跳转语句 while循环 穷举法 迭代法

    一  异常语句   ♦ try.....catch....finally 结构形式 try{ 可能会出错的代码语句 如果这里出错了,那么不会在继续下面的代码,而是直接进入catch中处理异常}catc ...

  9. python 穷举法 算24点(史上最简短代码)

    本来想用回溯法实现 算24点.题目都拟好了,就是<python 回溯法 子集树模板 系列 -- 7.24点>.无奈想了一天,没有头绪.只好改用暴力穷举法. 思路说明 根据四个数,三个运算符 ...

  10. HDU 1017 A Mathematical Curiosity【看懂题意+穷举法】

    //2014.10.17    01:19 //题意: //先输入一个数N,然后分块输入,每块输入每次2个数,n,m,直到n,m同一时候为零时  //结束,当a和b满足题目要求时那么这对a和b就是一组 ...

随机推荐

  1. (一)为什么要学习docker

    一.docker的历史与现状 1.PAAS平台的范围和内容 1.确定产品定位和需求,确定首次迭代的范围. 2.制作界面原型. 以下是 paas 范畴 .技术选型,然后根据技术选型为每个开发者搭建开发环 ...

  2. Codeforces Gym101522 C.Cheering-字符串 (La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017)

    C.Cheering To boost contestants' performances in the 20th La Salle - Pui Ching Programming Challenge ...

  3. window下Apache-http-server(httpd-2.4.12)安装与配置

    由于Apache官网改变策略(2015年1月左右),官网不再提供Apache-http-server的windows的编译版本,但是提供了几个第三方的版本 http://httpd.apache.or ...

  4. JUC线程池深入刨析

    JDK默认提供了四种线程池:SingleThreadExecutor.FiexdThreadPool.CachedThreadPool.ScheduledThreadPoolExecutor. 本文会 ...

  5. JAVA基础之List接口

    个人理解: list接口是Collection接口的子类,其继承了Collection接口的所有方法,但也有其独有的方法,不过在迭代的时候不要进行任何操作.牢记数据存储的四种结构:堆栈.队列.数组.链 ...

  6. SecureCRT同时向多个终端发送命令

    1.[View]->[Command Window] 2.[Send Command to]->[All Sessions] 参考: http://www.netingcn.com/sec ...

  7. [ios]objective-c 协议和委托 (重点基础知识)

    objective-c protocol delegateprotocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现. delegate-委托,顾名思义就是委托 ...

  8. 如何在window上把你的项目提交到github

    1.首先你需要在https://github.com/ 上注册一个账户 2.注册成功以后,你需要新建一个repository(储藏室),这个用来存放你要上传的项目 点击中间的带加号的图标就可以新建re ...

  9. Java中的http相关的库:httpclient/httpcore/okhttp/http-request

    httpclient/httpcore是apache下面的项目:中文文档下载参考 5 官网:http://hc.apache.org/ 在线文档:http://hc.apache.org/httpco ...

  10. MFC中 SDI/MDI框架各部分指针获取方式

    VC MFC SDI/MDI框架各部分指针获取方式   整理总结一下,希望能帮助到别人.   获得CWinApp 获得CMainFrame 获得CChildFrame 获得CDocument 获得CV ...