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

算法圖片

算法原題

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

算法思路

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

算法源碼

// 六桶酒的升數數組
$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>';
                    }
                }
            }
        }
    }
}

最後

這隻個人一種思路和實現方法,算法也不是很優,其餘的實現算法還有不少,歡迎你們評論留言,實現語言和方式不限,謝謝。spa

相關文章
相關標籤/搜索