Bookmark and Share

Lee's 程序人生

HTML CSS Javascript XML AJAX ATLAS C# C++ 数据结构 软件工程 设计模式 asp.net Java 数字图象处理 Sql 数据库
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

一个上市公司的面试题太变态了谁能解出来?高手来看

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(-=> 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(-=> 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));

?>

我要啦免费统计