php趣味100例 - php天平称物

(php,php趣味,php编程,php穷举法,php for循环的运用)

wKiom1LcdJiASQaUAAAQuHiGBEY342.jpg

<?php
/*
天平称物
4个砝码:总质量是40克。砝码的重量是整数。各不相等
这个组合可以称出1-40克的任意重量
w1,w2,w3,w4
w1+w2+w3+w4=40
w1!=w2!=w3!=w4
穷举法
这个组合可以称出1-40任意的重量
w 为任意重量(在1-40之间)
a1*w1+a2*w2+a3*w3+a4*w4 = W
a1~a4 在1 0 -1之间取值
比如如果要称重要为8的话
a1*w1+a2*w2+a3*w3+a4*w4 = 8
$flag=1表示可以40以内任意的值 0表示不能
穷举法
*/
header("Content-Type: text/html; charset=utf-8");
?>
<?php
    $w1=0;$w2=0;$w3=0;$w4=0;$w=0;
    for($w1=1;$w1<=40;$w1++){
        for($w2=$w1+1;$w2<=40-$w1;$w2++){
            for($w3=$w2+1;$w3<=40-$w2-$w1;$w3++){
                if(($w4=40-$w1-$w2-$w3)>=$w3){
                    if($w1!=$w2 && $w2!=$w3 && $w3!=$w4 && $w4!=$w1){
                             
                        for($w =1,$flag=1;$w<41&&$flag==1;$w++){//默认是1
                            for($a1=1,$flag=0;$a1>-2;$a1--){//设成0
                                for($a2=-1;$a2<2;$a2++){
                                    for($a3=-1;$a3<2;$a3++){
                                        for($a4=-1;$a4<2;$a4++){
                                            if( ($a1*$w1+$a2*$w2+$a3*$w3+$a4*$w4) == $w ){
                                                //echo $w.'='.$a1.'*'.$w1.' + '.$a2.'*'.$w2.' + '.$a3.'*'.$w3.' + '.$a4.'*'.$w4.'<br />';
                                                $flag =1;//如果能相等就设为1
                                            }
                                        }
                                    }
                                }
                            }      
                        }
                             
                        if($flag==1){
                                echo '四个砝码:'.$w1.' '.$w2.' '.$w3.' '.$w4;
                        }
                             
                    }
                }
            }
        }
    }
         
         
    //
         
         
         
?>