穷举(一):穷举法的基本思想
穷举是用计算机求解问题最常用的方法之一,常用来解决那些通过公式推导、规则演绎的方法不能解决的问题。采用穷举法求解一个问题时,通常先建立一个数学模型,包括一组变量、以及这些变量需要满足的条件。问题求解的目标就是确定这些变量的值。根据问题的描述和相关的知识,能为这些变量分别确定一个大概的取值范围。在这个范围内对变量依次取值,判断所取的值是否满足数学模型中的条件,直到找到全部符合条件的值为止。
穷举法(枚举法)的基本思想是:列举出所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的全部解答。
它利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检查,从中找出符合要求的答案。
用穷举算法解决问题,通常可以从两个方面进行分析。
(1)问题所涉及的情况:问题所涉及的情况有哪些,情况的种数可不可以确定。把它描述出来。应用穷举时对问题所涉及的有限种情形必须一一列举,既不能重复,也不能遗漏。重复列举直接引发增解,影响解的准确性;而列举的遗漏可能导致问题解的遗漏。
(2)答案需要满足的条件:分析出来的这些情况,需要满足什么条件,才成为问题的答案。把这些条件描述出来。
只要把这两个方面分析好了,问题自然会迎刃而解。
穷举通常应用循环结构来实现。在循环体中,根据所求解的具体条件,应用选择结构实施判断筛选,求得所要求的解。
穷举法的程序框架一般为:
cnt=0; // 解的个数初值为0
for(k=<区间下限>;k<=<区间上限>;k++) // 根据指定范围实施穷举
if (<约束条件>) // 根据约束条件实施筛选
{
cout<<(<满足要求的解>); // 输出满足要求的解
cnt++; // 统计解的个数
}
【例1】硬币方案
有50枚硬币,可能包括4种类型:1元、5角、1角和5分。
已知50枚硬币的总价值为20元,求各种硬币的数量。
例如:2、34、6、8就是一种方案。而2、33、15、0是另一个可能的方案,显然方案不唯一。
编写程序求出类似这样的不同的方案一共有多少种?
(1)编程思路。
直接对四种类型的硬币的个数进行穷举。其中,1元最多20枚、5角最多40枚、1角最多50枚、5分最多50枚。
另外,如果以元为单位,则5角、1角、5分会化成浮点型数据,容易计算出错。可以将1元、5角、1角、5分变成100分、50分、10分和5分,从而全部采用整型数据处理。
(2)源程序及运行结果。
#include <iostream>
using namespace std;
int main()
{
int a,b,c,d,cnt=0;
for(a=0;a<=20;a++)
for(b=0;b<=40;b++)
for(c=0;c<=50;c++)
for(d=0;d<=50;d++)
{
if(a*100+b*50+c*10+d*5==2000 && a+b+c+d==50)
{
cout<<a<<" , "<<b<<" , "<<c<<" , "<<d<<endl;
cnt++;
}
}
cout<<"Count="<<cnt<<endl;
return 0;
}
(3)程序的优化。
上面的程序采用穷举法求解,比较简单。但在穷举结构的设置、穷举参数的选取等方面存在着改进与优化的空间。
一般来说,在采用穷举法进行问题求解时,可从两个方面来优化考虑。
1)建立简洁的数学模型。
数学模型中变量的数量要尽量少,它们之间相互独立。这样问题解的搜索空间的维度就小。反应到程序代码中,循环嵌套的层次就少。例如,上面的程序中,采用变量a、b、c、d分别表示1元、5角、1角和5分硬币的枚数,对这4个变量穷举,循环层次为4层。实际上这4个变量彼此间有两个条件在约束,或者枚数等于50,或者总价值为20元。因此,可以只穷举3个变量,另外一个变量通过约束条件求出,从而将循环层次减少为3层。
2)减小搜索的空间。
利用已有的知识,缩小数学模型中各个变量的取值范围,避免不必要的计算。反应到程序代码中,循环体被执行的次数就减少。例如,在穷举时,先考虑1元的枚数a,最多为20枚(即0<=a<=20),再考虑5角的枚数b,若采用总价值不超过20元约束,则其枚数最多为(2000-a*100)/50枚(即0<=b<=(2000-a*100)/50),之后考虑1角的枚数c,其枚数最多为 (2000-a*100-b*50)/10(即0<=c<=(2000-a*100-b*50)/10)。这样穷举的循环次数会大大减少。
采用上述思路优化后的源程序如下。
#include <iostream>
using namespace std;
int main()
{
int a,b,c,d,cnt=0;
for(a=0;a<=20;a++)
for(b=0;b<=(2000-a*100)/50;b++)
for(c=0;c<=(2000-a*100-b*50)/10;c++)
{
d=(2000-a*100-b*50-c*10)/5; // 剩下的用5分硬币填充
if(a+b+c+d==50)
{
cout<<a<<" , "<<b<<" , "<<c<<" , "<<d<<endl;
cnt++;
}
}
cout<<"Count="<<cnt<<endl;
return 0;
}
也可以采用总枚数不超过50枚约束。先考虑1元的枚数a,最多为20枚(即0<=a<=20),再考虑5角的枚数b,则其枚数最多为(50-a)枚(即0<=b<=(50-a),之后考虑1角的枚数c,其枚数最多为 (50-a-b)枚(即0<=c<=50-a-b)。采用这种思路优化后的源程序如下。
#include <iostream>
using namespace std;
int main()
{
int a,b,c,d,cnt=0;
for(a=0;a<=20;a++)
for(b=0;b<=50-a;b++)
for(c=0;c<=50-a-b;c++)
{
d=50-a-b-c; // 剩下的用5分硬币填充
if(100*a+50*b+10*c+5*d==2000)
{
cout<<a<<" , "<<b<<" , "<<c<<" , "<<d<<endl;
cnt++;
}
}
cout<<"Count="<<cnt<<endl;
return 0;
}
转载于:https://www.cnblogs.com/cs-whut/p/11015258.html
穷举(一):穷举法的基本思想相关推荐
- 居则视其所亲,富则视其所与,达则视其所举,穷则视其所不为,贫则视其所不取。...
<史记>.李克对魏文侯 魏文侯欲置相,召李克问曰,.... 李克曰:"夫观士也,居则视其所亲,富则视其所与,达则视其所举,穷则视其所不为,贫则视其所不取.此五者足以观矣.&qu ...
- 知名科幻作家称AI让富者更富、穷者更穷 | 思科推出全球首款人工智能会议语音助手
每一个企业级的人 都置顶了 中国软件网 中国软件网 为你带来最新鲜的行业干货 小编点评 马云家的鲁班双十一设计4亿张海报 设计师内牛满面 今日头条家的张小明吃着火锅唱着歌写了200篇稿 记者们目瞪 ...
- 穷人python入门教程视频_穷的解释|穷的意思|汉典“穷”字的基本解释
详细字义 ◎ 穷 窮 qióng 〈形〉 (1) (形声.从穴,躬声.躬,身体,身在穴下,很窘困.简化字为会意,力在穴下,有劲使不出.本义:穷尽,完结) (2) 同本义 [end;limit] 穷,极 ...
- 人生莫大的悲哀,不是穷,而是穷忙
作者 | 沈小星 来源 | Stevenandbook(ID) 每到年底,这个时候我都特别忙,与保险.金融公司有业务上的往来.上周一大早,从上海坐高铁到苏州,刚好与我的前同事Linda坐同一趟列车. ...
- 穷举法python例子_(Python)简单线性模型与穷举优化,穷举法
一个简单的线性模型,使用穷举法计算所有最小二乘误差,并生成分析图. import numpy as np import matplotlib.pyplot as plt # 简单线性模型-穷举法优化 ...
- 求解TSP问题(python)(穷举、最近邻居法、opt-2法、动态规划、插入法)
TSP问题(python) 排序问题 读取文件格式:第一行为城市数目,剩余行为各城市坐标 (1) 城市全排列,在所有解决方案中选择最好的一个(解决20个城市的时候会有困难了(见维基百科)) # 生成全 ...
- 1023穷游?“穷”游
Description 贫穷的小A有一个梦想,就是到t国去一次穷游,但现实是残酷的.小A所在的世界一共有n(n<=500) 个国家,国家与国家之间总共有E(E<=50000)条道路相连,第 ...
- 1023 穷游?“穷”游?
Description 贫穷的小A有一个梦想,就是到t国去一次穷游,但现实是残酷的.小A所在的世界一共有n(n<=500) 个国家,国家与国家之间总共有E(E<=50000)条道路相连,第 ...
- 跳槽穷半年,转行穷三年,死守会穷一辈子
好久没更新博客了,终于生活有回归正轨了.enjoying... 金三银四,赶在2015年的银四的末尾跳槽了.换了个新公司,在新环境已经呆了一周. 2012届毕业生,从毕业就一直在一家创业公司干了近3年 ...
- 递归下降分析法的基本思想。_还不懂这八大算法思想,刷再多题也白搭!
各位朋友好久不见呢.最近由于刚入职,作为职场萌新,所以大部分时间都花在了工作上.因而也没有太多时间来写文章啦,这篇文章也是定题了许久,迟迟没有落笔.等之后工作慢慢稳定,业务熟练起来,文章更新频率就会高 ...
最新文章
- 授权管理【学习笔记】《卓有成效的管理者》 第二章 掌握自己的时间
- 可以多次使用同一个hbitmap吗_一个部位可以多次吸脂吗?
- 「机器人界的微软」创始人逝世,从iPhone到汽车都离不开他的创造
- SASS 和 SCSS 的区别
- HDU1753: 大明A+B
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-008-带参数的ADVICE
- 浅谈闪电网络的可行性
- JavaScript学习笔记 1
- 全球最厉害的14位程序员!你知道有哪几位?
- WINDOWS下获取目录环境变量的C代码
- 流文件 服务器无响应,文件服务器配置程序未响应
- 淘淘商城第17讲——引用Dubbo服务
- Go语言实战抽奖系统
- 51单片机蜂鸣器播放音乐C语言程序实例,51单片机 使用蜂鸣器播放简单音乐
- 国货崛起,科技潮流——雷神星驰轮胎
- Oracle 计算日期规避节假日
- Python不用声明变量吗
- Android开发必备(干货源码放送大)
- “敬老孝亲颂家风 做美德传承人”主题实践活动总结
- Error: #260-D: explicit type is missing (int assumed)的解决方法
热门文章
- Android 对于外部TF(SD)卡和U盘的读写操作
- MySQL设置索引used in key specification without a key length
- Linux下7z压缩解压软件区别
- 推广的euclid_问题引导的代数学: Euclid 空间 III
- mysql migration 使用_Mysql下使用EFCore的CodeFirst和Migration功能
- c语言中文网va_list,深入C语言可变参数(va_arg,va_list,va_start,va_end,_INTSIZEOF)
- python之控制台版本(电影)增删改查
- HTML_body中常用的标签部分
- Specular Highlights(镜面光)
- LeetCode 108. 将有序数组转换为二叉搜索树