简析穷举算法,及其简单应用

穷举概述

  • 穷举法又称列举法,其基本思想是逐一列举问题所涉及的所有情况。
  • 穷举法常用于解决“是否存在”或“有多少种可能”等问题。
  • 应用穷举法时应注意对问题所涉及的有限种情形须一一列举,既不能重复,又不能遗漏。
  • 穷举通常应用循环结构来实现。在循环体中,应用选择结构实施判断筛选,求得所要求的解。

    虽然巧妙和高效的算法很少来自穷举,但穷举设计作为一种常用的基础算法也很有意义:
    (1) 理论上,穷举可以解决可计算领域中的各种问题。尤其处在计算机计算速度非常高的今天,穷举的应用领域是非常广阔的。
    (2) 在实际应用中,通常要解决的问题规模不大,用穷举设计的算法其运算速度是可以接受的。此时,设计一个更高效率的算法代价不值得。
    (3) 穷举可作为某类问题时间性能的底限,用来衡量同样问题的更高效率的算法。

首先我们来看一个经典的例子:

百鸡百钱问题:

已知:公鸡5元一只,母鸡3元一只,小鸡一元3只。现用100元钱买了100只鸡。
问:公鸡母鸡小鸡各几只?(请考虑尽可能高效的方法)实际上上面的问题直接用数学的方法是不容易解出来的,因为未知数的个数多余方程的个数。这时就可以用到穷举法,列出所有的可能性。分析:
假设0只公鸡,0只母鸡,0只小鸡。结果???
假设0只公鸡,0只母鸡,1只小鸡。结果???
假设0只公鸡,0只母鸡,2只小鸡。结果???
......
假设0只公鸡,1只母鸡,0只小鸡。结果???
假设0只公鸡,1只母鸡,1只小鸡。结果???
假设0只公鸡,1只母鸡,2只小鸡。结果???
......
......
假设1只公鸡,0只母鸡,1只小鸡。结果???
假设1只公鸡,0只母鸡,2只小鸡。结果???
假设1只公鸡,0只母鸡,3只小鸡。结果???
......
......
......
假设100只公鸡,100只母鸡,100只小鸡。结果???
以上共有101*101*101(即1030301)种可能情况。这种思想,就是穷举思想,适合:问题的答案可能没有很直接的逻辑推理,但可以将所有“可能答案”都罗列出来,并且具有一定的规律性。
//原始思路:(穷举)
$count1 = 0;
for($gongji = 0; $gongji <= 100; ++ $gongji){for($muji = 0; $muji <= 100; ++ $muji){for($xiaoji = 0; $xiaoji <= 100; ++ $xiaoji){$shuliang = $gongji + $muji + $xiaoji;$zongjia = ($gongji * 5) + ($muji * 3) + ($xiaoji / 3);if( ($zongjia == 100) && ($shuliang == 100) ){echo "<br />公鸡有{$gongji}只,母鸡有{$muji}只,小鸡有{$xiaoji}只。";    }++ $count1;    //计算的次数}}
}echo "<br />总共计算了{$count1}次";  //1030301次,即101^3
echo "<hr />";

虽然对于计算机来说计算1030301次并不困难,但我们可以对上面的代码进行优化,尽可能的提高效率。

//优化1:
$count2 = 0;
for($gongji = 0; $gongji <= 100/5; ++ $gongji){ //考虑公鸡的价格for($muji = 0; $muji <= 100/3; ++ $muji){    //考虑母鸡的价格//for($xiaoji = 0; $xiaoji <= 100; ++ $xiaoji){$xiaoji = 100 - ($gongji + $muji); //公鸡母鸡的数量确定了,那么小鸡的数量也就确定了$zongjia = ($gongji * 5) + ($muji * 3) + ($xiaoji / 3);if( $zongjia == 100 ){echo "<br />公鸡有{$gongji}只,母鸡有{$muji}只,小鸡有{$xiaoji}只。";   }++ $count2;    //计算的次数//}}
}echo "<br />总共计算了{$count2}次";  //714次,优化了不少
echo "<br />";
//优化2:
$count3 = 0;
for($gongji = 0; $gongji <= 100/5; ++ $gongji){    //考虑公鸡的价格for($muji = 0; $muji <= (100-$gongji*5)/3; ++ $muji){ //考虑母鸡的价格,以及公鸡所花掉的钱//for($xiaoji = 0; $xiaoji <= 100; ++ $xiaoji){$xiaoji = 100 - ($gongji + $muji); //公鸡母鸡的数量确定了,那么小鸡的数量也就确定了$zongjia = ($gongji * 5) + ($muji * 3) + ($xiaoji / 3);if( $zongjia == 100 ){echo "<br />公鸡有{$gongji}只,母鸡有{$muji}只,小鸡有{$xiaoji}只。";   }++ $count3;    //计算的次数//}}
}echo "<br />总共计算了{$count3}次";  //364次
echo "<br />";
//优化3:
$count4 = 0;
for($gongji = 0; $gongji <= 100/5; ++ $gongji){    //考虑公鸡的价格for($muji = 0; $muji <= (100-$gongji*5)/3; ++ $muji){ //考虑母鸡的价格,以及公鸡所花掉的钱//for($xiaoji = 0; $xiaoji <= 100; ++ $xiaoji){$xiaoji = 100 - ($gongji + $muji); //公鸡母鸡的数量确定了,那么小鸡的数量也就确定了if($xiaoji % 3 != 0){//考虑小鸡的数量应该是3的倍数,价钱才能是“整数”continue;   //如果条件成立,直接跳出本次循环,后面的不再运算}$zongjia = ($gongji * 5) + ($muji * 3) + ($xiaoji / 3);if( $zongjia == 100 ){echo "<br />公鸡有{$gongji}只,母鸡有{$muji}只,小鸡有{$xiaoji}只。";   }++ $count4;    //计算的次数//}}
}echo "<br />总共计算了{$count4}次";  //121次

再来看下面一个例子:

数学问题:

有i,j,k,m,n五个字母分别代表0~9的数字,满足下面条件:
求i,j,k,m,n的实际值
    i  j  k  m  n
*                  i
------------------------
 n  n  n  n  n  n
<style>
div{ width:300px; position:relative;}
div span{ margin:10px;}
</style>
<script>
window.onload = function(){var aP = document.getElementsByTagName('p');var aSpan1 = aP[0].getElementsByTagName('span');var aSpan2 = aP[1].getElementsByTagName('span');var aSpan3 = aP[2].getElementsByTagName('span');for(var i=1;i<=9;i++){for(var j=0;j<=9;j++){for(var k=0;k<=9;k++){for(var m=0;m<=9;m++){for(var n=0;n<=9;n++){var a = 10000*i + 1000*j + 100*k + 10*m + n;var b = i;var c = n*111111;if(a*b==c){aSpan1[0].innerHTML = i;aSpan1[1].innerHTML = j;aSpan1[2].innerHTML = k;aSpan1[3].innerHTML = m;aSpan1[4].innerHTML = n;aSpan2[0].innerHTML = i;for(var x=0;x<aSpan3.length;x++){aSpan3[x].innerHTML = n;}}}}}}}};</script>
</head><body>
<div>
<p style="margin-left:35px;">
<span>i</span><span>j</span><span>k</span><span>m</span><span>n</span>
</p>
<p>*
<span style=" position:absolute; top:30px; left:180px;">i</span>
</p>
<hr />
<p>
<span>n</span><span>n</span><span>n</span><span>n</span><span>n</span><span>n</span>
</p>
</div>
</body>

运行结果为:

    7  9  3  6  5
*                  7
------------------------
 5  5  5  5  5  5

也就是i=7, j=9, k=3, m=6, n=5.
即79365*7=555555.

简析穷举算法,及其简单应用相关推荐

  1. java穷举密码_穷举算法和递推算法(Java)

    穷举算法 概念: 最简单算法,依赖计算机的强大计算能力穷尽每一种可能的情况.穷举算法效率不高,但是适合一些没有明显规律可循的场合. 思想: 在使用穷举算法时,需要明确问题答案的范围,这样才可能在指定范 ...

  2. 百钱百鸡php穷举法,PHP经典题:百钱百鸡问题(穷举算法)

    PHP经典题:百钱百鸡问题(穷举算法) 百钱百鸡问题: 已知:公鸡5元一只,母鸡3元一只,小鸡一元3只 现用100元钱买了100只鸡,问:公鸡母鸡小鸡各几只? --请考虑尽可能高效的方法 思路: 如果 ...

  3. 穷举算法——奶牛碑文(cow)

    - 穷举算法--奶牛碑文(cow) 题目描述 小伟暑假期间到大草原漫游,在一块石头上发现了一些有趣的碑文.碑文似乎是一个神秘古老的语言,只包括三个大写字母 C.O 和W. 尽管小伟看不懂,但是令他高兴 ...

  4. 3388=24及24点游戏的穷举算法

    偶尔看到一题:用3 3 8 8 四个数和加减乘除组合得出24,前提是用完这四个数,几年没好好思考了,偶算了半天没答案,就写了个穷举算法,呵呵,貌似结果只有一种啊,各位兄台还有其它答案么? packag ...

  5. 穷举算法(鸡兔同笼问题)

    穷举算法的基本思想就是从所有可能的情况中搜索正确的答案,其执行步骤如下: (1)对于一种可能的情况,计算其结果. (2)判断结果是否满足要求,如果不满足则进行执行第(1)步来搜索下一个可能的情况:如果 ...

  6. 子图同构算法——Ullmann算法(1)不包含refine procedure的简单穷举算法。

    摘要: 转载请注明来自stanlysheng--talk is cheap, show me your code.http://www.cnblogs.com/stanly/ .谢谢.此文我也在CSD ...

  7. 农民过河算法可爱的学习----记录于高考报名后的怀旧emo时刻--穷举算法

    很多关卡在向孩子教学代码的同时,更是在潜移默化地训练孩子的编程思维. 在最开始的地牢地图中,孩子需要使用「While-True」循环语句,穿过一个又一个结构重复的迷宫. 在学习「While-True」 ...

  8. 旅行商问题穷举算法c语言,什么是旅行商问题——算法NP、P、NPC知识

    旅行商问题 旅行商问题所描述的是这样一个场景: 有一个商品推销员,要去若干个城市推销商品.该推销员从一个城市出发,需要经过所有城市后,回到出发地.每个城市之间都有道路连通,且距离各不相同,推销员应该如 ...

  9. c语言穷举算法 枚举法,c语言枚举法 穷举法 ppt课件

    枚举法 穷举法 笨人之法 把所有可能的情况一一测试 筛选出符合条件的各种结果进行输出 分析 这是个不定方程 三元一次方程组问题 三个变量 两个方程 x y z 1005x 3y z 3 100设公鸡为 ...

最新文章

  1. QoS policy-map class-map
  2. SharePoint 2007 Web Content Management 性能优化系列 前言
  3. 老子今天不加班,程序员也需要自由
  4. highcharts动态获取数据生成图表问题
  5. XNA实现不停循环的路的效果
  6. SOLIDWORDS API修改零部件属性全部保存
  7. 普元EOS在运算逻辑里面调用HttpServletRequest ,HttpServletResponse
  8. 手机话费充值和手机流量充值 API
  9. 2021年10月国产数据库排行榜:达梦反超OceanBase夺榜眼,TDSQL实现“四连增”,数据生态加速建设
  10. pdf阅读器,pdf阅读器大全,最好pdf阅读器排行,pdf阅读器下载
  11. 初识angular.js之爱恨情仇
  12. Django中filer和get的区别
  13. 巴西龟饲养日志----巴西龟成长标志
  14. 基于SDK的支付接口服务端——支付宝,微信
  15. AndroidStudio按钮实现点击响应详细代码
  16. 从招行权证疯炒看权证风险
  17. 大概率思维《The House Advantage》
  18. 虚拟机如何设置静态IP
  19. Quartus计算机组成与设计实验原理图整理(十)——二进制补码加法器实验
  20. java8新特性-Stream入门学习

热门文章

  1. android系统测试接口开发,Android开发者如何模拟接口获得自己想要的数据进行测试?...
  2. 【测试】bug的生命周期和组成部分
  3. 加快数字化发展 建设数字中国
  4. 三角函数反函数c语言,高中数学反函数有哪些 反三角函数的所有公式
  5. js node.js读取excel文件返回为json文本
  6. 国内外顶级核心期刊TOP20
  7. Linux创建自启动服务
  8. 《潜规则》吴思-摘抄
  9. oracle中的blob类型,clob类型,nclob类型主要区别是什么
  10. 数商云:把握数字化核心趋势,推动煤炭企业数字化转型布局