计算机算法之穷举法

来源:互联网 发布:网络审计设备 编辑:程序博客网 时间: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
原创粉丝点击