莫斯科的一位酒商现有六桶酒,容量分别为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