算法原題
莫斯科的一位酒商現有六桶酒,容量分別爲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>';
}
}
}
}
}
}
最後
這隻我的一種思路和實現方法,算法也不是很優,其他的實現算法還有很多,歡迎大家評論留言,實現語言和方式不限,謝謝。