算法題之計算那一桶是紅酒

算法圖片

算法原題

莫斯科的一位酒商現有六桶酒,容量分別爲30升、32升、36升、38升、40升、62升。白酒五桶,紅酒一桶。他的酒都是整桶出售,上午賣出了兩桶白酒,下午賣出的白酒是上午的兩倍。請問:紅酒是哪一桶?

算法思路

由於總共有六桶酒,其中白酒五桶,紅酒一桶;那麼也就是說,下午賣出的N桶白酒的升數是早上賣出的兩桶白酒升數的兩倍,由於沒說明下午賣出了多少桶,所以N是不確定的,也就是N的範圍是1-3;但是,從六桶酒可以知道,升數最小的是30升和32升,這兩個數的和爲62升,那麼下午至少賣出124升,即N桶的升數不能小於124,再看看其他桶的升數,所以N只能是3;也就是最終知道,早上賣出兩桶白酒,下午賣出三桶白酒,並且早上兩桶白酒的升數的兩倍等於下午賣出的三桶白酒的升數,然後剩下的一桶就是紅酒了。

<!--more-->

算法源碼

// 六桶酒的升數數組
$arr = [30, 32, 36, 38, 40, 62];
$len = count(arr);
// 隨機取兩桶假設爲白酒
for ($i = 0; $i < $len-1; $i++) {
    for ($j = 1 + $i; $j < $len; $j++) {
        $twoArr = $arr;
        // 去掉早上賣出的兩桶白酒
        unset($twoArr[$i]);
        unset($twoArr[$j]);
        $twoArr = array_values($twoArr);
        // 從剩下的取出三桶假設爲白酒
        for ($n = 0; $n < $len - 4; $n++) {
            for ($m = 1 + $n; $m < $len - 3; $m++) {
                for ($p = 1 + $m; $p < $len - 2; $p++) {
                    // 早上白酒總和
                    $oneSum = $arr[$i] + $arr[$j];
                    // 下午白酒總和
                    $twoSum = $twoArr[$n] + $twoArr[$m] + $twoArr[$p];
                    // 如果早上賣出白酒的升數的兩倍等於下午賣出白酒的升數,那麼即符合所求
                    if ($oneSum * 2 == $twoSum) {
                        echo '早上賣出的白酒是:' . $arr[$i] . '、'. $arr[$j] . '<br>';
                        echo '下午賣出的白酒是:' . $twoArr[$n] . '、'. $twoArr[$m] . '、'. $twoArr[$p] . '<br>';
                        echo '所有五桶白酒是:' . $arr[$i] . '、'. $arr[$j] . '、'. $twoArr[$n] . '、'. $twoArr[$m] . '、'. $twoArr[$p] . '<br>';
                        $tmpArr = $twoArr;
                        // 去掉下午賣出的三桶白酒
                        unset($tmpArr[$n]);
                        unset($tmpArr[$m]);
                        unset($tmpArr[$p]);
                        // 剩下的一桶就是所求紅酒
                        echo '一桶紅酒是:' . current($tmpArr) . '<hr>';
                    }
                }
            }
        }
    }
}

最後

這隻我的一種思路和實現方法,算法也不是很優,其他的實現算法還有很多,歡迎大家評論留言,實現語言和方式不限,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章