一个上市公司的面试题太变态了谁能解出来?高手来看
A:80 B:158 C:464 D:608 E:1326 F:5164 G:2724 H:1452
分别有以上8个产品 冒号后面是价格
要求 用户输入一个 价格比如 1166 然后程序要算出 可能有的集中产品 价格总和为1166 的排列组合
例如:1166 = 80 + 158 + 464 +464 排列为 A B C(2) [如果有多种可能也要列举出来有可能2个A 2个B 1个C类似这种]
那个高手能用穷举 组合 做做看这道难题目那?
<?php
/**
* 过滤大于input的数组单元
*
* @param mix $val
* @return boolean
*/
function realFilter($val) {
return $val < $GLOBALS['input'];
}
/**
* 获取组成的列表
*
* @param int $input
* @return array
*/
function getList($input) {
$price = $GLOBALS['price'];
// 初始价格数组
$price = array_filter($price, 'realFilter');
// 低于最小的元素
if(!$price) {
exit();
}
rsort($price);
// 初始化
$stack = array(-1 => 0);
$length = count($price);
$lists = array();
// 循环放入堆栈
$i = 0;
$break = false;
do{
// 压栈
if(array_sum($stack) < $GLOBALS['input']) {
array_push($stack, $price[$i]);
} else {
// 记录组合
if(array_sum($stack) == $GLOBALS['input']) {
// 格式化这里
$lists[] = formatList($stack);
}
// 出栈
do{
$last = array_pop($stack);
if($last == 0) {
$stack = array(-1 => 0);
$break = true;
break;
}
$i = array_search($last, $price);
$i++;
} while($i >= $length);
if($break) break;
}
} while(true);
return $lists;
}
/**
* 格式化$stack数组
*
* @param array $stack
* @return array
*/
function formatList($stack) {
foreach($stack as $key => $value) {
if($value == 0) {
unset($stack[$key]);
continue;
}
$stack[$key] = $GLOBALS['type'][array_search($value, $GLOBALS['price'])];
}
return $stack;
}
$price = array(80,158,464,608,1326,5164,2724,1452);
$type = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H');
$input = 2000;
var_dump(getList($input));
?>