枚举法的本质就是从全部候选答案中去搜索正确的解,使用该算法须要满足两个条件:
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. C#图解教程学习笔记——类和继承

    一.屏蔽基类的成员所有类都派生自object类.虽然类只能直接继承一个基类,但继承的层次没有限制.虽然派生类不能删除它继承的任何成员,但可以用与基类同名的成员来屏蔽(mask)基类成员.1. 要屏蔽一 ...

  2. C语言联合体

    C语言联合体Unions实例代码教程 - 联合是一种特殊的数据类型在C语言中,使您可以存储不同的数据类型相同的内存位置. 联合是一种特殊的数据类型在C语言中,使您可以存储不同的数据类型相同的内存位置. ...

  3. codeigniter 使用

    CodeIgniter系列 记录count和分页 对于某个表的不带条件的count,可以简单的用 $total = $this->db->count_all($table_name) 来获 ...

  4. OFV.msi是什么 为什么更新时无法安装

    在网络上搜索了下 这个是Microsoft Office 文件验证加载项,微软提供了一个单独的文件:http://www.microsoft.com/downloads/zh-cn/confirmat ...

  5. Spark sql读取数据库和ES数据进行处理代码

    读取数据库数据和ElasticSearch数据进行连接处理 import java.util.HashMap; import java.util.List; import java.util.Map; ...

  6. TensorFlow笔记三:从Minist数据集出发 两种经典训练方法

    Minist数据集:MNIST_data 包含四个数据文件 一.方法一:经典方法 tf.matmul(X,w)+b import tensorflow as tf import numpy as np ...

  7. 2016.7.5 如何在maven中添加所需依赖(只知道jar包的部分名字的情况)

    (1)进入官网仓库 http://mvnrepository.com/ (2)输入需要的jar包名 比如这里的jota-time (3)寻找需要的版本,并选取需要的版本 (4)复制需要的maven依赖 ...

  8. vue.js+koa2项目实战(四)搭建koa2服务端

    搭建koa2服务端 安装两个版本的koa 一.版本安装 1.安装 koa1 npm install koa -g 注:必须安装到全局 2.安装 koa2 npm install koa@2 -g 二. ...

  9. VUE 路由变化页面数据不刷新问题

    出现这种情况是因为依赖路由的params参数获取写在created生命周期里面,因为相同路由二次甚至多次加载的关系 没有达到监听,退出页面再进入另一个文章页面并不会运行created组件生命周期,导致 ...

  10. UNP学习笔记(第三章:套接字编程简介)

    本章开始讲解套接字API. 套接字地址结构 IPv4套接字地址结构 它以sockaddr_in命名,下面给出它的POSIX定义 struct in_addr { in_addr_t s_addr; } ...