计算机算法之穷举法
来源:互联网 发布:网络审计设备 编辑:程序博客网 时间:2024/05/21 00:18
以下应用题求解: 甲、乙、丙、丁四人共加工零件370个,如果把甲做的个数加10个,乙做的个数减20个,丙做的个数乘以2,丁做的个数除以2,那么这四人的数正好相等,求甲实际加工了多少个零件?
因为工作的缘故,作为一个PHPer,接触最多的就是PHP,所以在这里我首先是用PHP方法实现的。
这个是最原始的版本,要列举很多次,直到找到正确的解法。服务器运行时间会很长!
<span style="font-size:14px;"><?php set_time_limit(0);header("content-type:text/html;charset=utf-8"); //穷举法之原始版 //取出$a,$b,$c,$d的取值范围,总不能大于370,所以先取370;即$a<=370;$b<=370;$c<=370;$d<=370;for ($a=1; $a<=370; $a++) { for($b=1; $b<=370; $b++) { for ($c=1; $c<=370; $c++) { for($d=1; $d<=370; $d++) { if( ($a + $b + $c + $d) ==370 && ( $b== ($a+30)) && ( $c==($a+10)/2) && ( $d ==($a+10)*2) ) { echo "甲的值是" . $a; echo "<br />乙的值是" . $b; echo "<br />丙的值是" . $c; echo "<br />丁的值是" . $d; } } } }}?>
下面这个是优化版,即定义两个变量,找出其中的关联式,使条件成立。大大简化了服务器的运行时间和运行效率。
<span style="font-size:14px;"><?phpset_time_limit(0);header("content-type:text/html;charset=utf-8");/*$a是定义的甲变量; $a+10=乙-20;即乙=$a+30;$b是定义的丙变量;$b*2=丁/2; 即丁= 4*$b;定义变量(两个)$a , $a+30 , $b, 4 * $b;$a+ ($a+30) + $b + (4* $b) = 370;且 $a + 10 == 2 * $b;$a是定义的甲变量; $b是定义的丙变量;乙变量是$a+30; 丁变量是4 * $b;*/class runtime //定义一个类,用于计算时间{ var $StartTime = 0; var $StopTime = 0; function get_microtime() { list($usec, $sec) = explode(' ', microtime()); //计算微秒,即加上代码运行时间的计算输出 return ((float)$usec + (float)$sec); } function start() { $this->StartTime = $this->get_microtime(); } function stop() { $this->StopTime = $this->get_microtime(); } function spent() { return round(($this->StopTime - $this->StartTime) * 1000, 1); }} //计算脚本语言运行时间 $runtime = new runtime(); $runtime -> start(); $count = 0; for ($a=1; $a<=370; $a++) {for($b=1; $b<=370; $b++){ if( ($a + ($a+30) +$b + (4 * $b)) == 370 && ($a + 10 == 2*$b) ) { echo "甲的值是" . $a . '<br/>'; echo "乙的值是" . ($a+30) . '<br/>'; echo "丙的值是" . $b . '<br />'; echo "丁的值是" . $b*4 . '<br />'; } } $count++; } echo "计算次数是:" . $count . "<br />"; $runtime->stop(); echo "页面执行时间: ".$runtime->spent()." 毫秒";?>
下面是运行速度最快的,是穷举法的最终版本。定义一个变量,找出其中的关联式,使条件成立。
<?phpheader("content-type:text/html;charset=utf-8");/*$a是定义的甲变量; $a+10=乙-20;即乙=$a+30;$a+10=丙*2; 即丙=($a+10)/2;$a+10=丁/2; 即丁=2*($a+10);$a , $a+30 , ($a+10)/2, 2*($a+10);$a+ ($a+30) + ($a+10)/2 + 2*($a+10) = 370;*/class runtime //定义一个类,用于计算时间{ var $StartTime = 0; var $StopTime = 0; function get_microtime() { list($usec, $sec) = explode(' ', microtime()); //计算微秒 return ((float)$usec + (float)$sec); } function start() { $this->StartTime = $this->get_microtime(); } function stop() { $this->StopTime = $this->get_microtime(); } function spent() { return round(($this->StopTime - $this->StartTime) * 1000, 1); }}$runtime = new runtime();$runtime -> start();$count = 0;for ($a=1; $a<=370; $a++) {if( $a+ ($a+30) + ($a+10)/2 + 2*($a+10) == 370){echo "甲的值是" . $a . '<br/>';echo "乙的值是" . ($a + 30) . '<br/>';echo "丙的值是" . ($a + 10)/2 . '<br/>';echo "丁的值是" . ($a + 10)* 2 . '<br/>';}$count++;}echo "计算次数是:" . $count . "<br />";$runtime->stop();echo "页面执行时间: ".$runtime->spent()." 毫秒";?>
0 0
- 计算机算法之穷举法
- 算法思想之穷举法
- 数据结构与算法之穷举法
- 再试算法----穷举法
- 算法设计之—直接 遍历/穷举法、贪心算法
- 基础算法学习之穷举
- 算法设计基本方法之穷举法/试探法
- 常用算法设计方法之穷举搜索法
- 基本算法思想之穷举法(C++语言描述)
- 数据结构与算法之枚举(穷举)法 C++实现
- 穷举法之韩信点兵
- 算法学习笔记之穷举算法
- 常用算法 --- 穷举搜索法
- 勤劳的算法-穷举法
- C++算法封装:穷举法
- 一道穷举法算法题
- 算法基础一 穷举法
- 穷举搜索法算法讲解
- 第八周项目2-建立链串的算法库
- vmware fusion 8.0上成功安装雨林木风的windows10 企业版 64位gost版
- (OK) Building Ice Cream Sandwich (Android v4) for VirtualBox on EC2
- Error1error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
- HDU1556 color the ball(树状数组)向下查询,向上统计
- 计算机算法之穷举法
- 《TCP/IP详解:卷一》第1章:概述
- LinearLayout和Relativelayout的右对齐问题
- Sencha Touch 2 官方文档翻译之 Sencha Touch 2应用程序简介
- 《初入linux》--第九部分-linux的日志管理
- linux串口收发程序
- 用Spring MVC搭建REST风格的服务
- Windows核心编程 第十二章 纤程
- 大数据Spark “蘑菇云”行动第62课: 广告点击系统数据库系统DAO实现