莫斯科的一位酒商現有六桶酒,容量分別爲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