PHP :Может ли массив чисел складываться в число

Это скорее головоломка, чем что-либо еще. Я на самом деле нашел решение, но оно настолько медленное, что я думал, что потерял подключение к Интернету (см. ниже ).

Вот в чем проблема:

Скажем, у меня есть массив чисел, например:

$numbers_array = array(1, 2, 3, 4, 5, 6, 7, 8, 9);

Допустим также, что у меня есть несколько чисел, хранящихся в таких переменных, как:

$sum = 15;
$sum2 = 24;
$sum3 = 400;

Я пытаюсь создать функцию, которая вернет true, если любое из чисел в $numbers_arrayможно сложить вместе (, каждое из которых используется только один раз )для формирования сумм:

function is_summable($array_of_nums, $sum_to_check) {
    //What to put here?
}

var_dump(is_summable($numbers_array, $sum));
var_dump(is_summable($numbers_array, $sum2));
var_dump(is_summable($numbers_array, $sum3));

Вышеприведенное должно вывести:

bool(true)
bool(true)
bool(false)

Поскольку 7 + 8 = 15, 7 + 8 + 9 = 24, но никакая комбинация 1 -9 не может дать 200.

Вот мое ОЧЕНЬ медленное решение:

function is_summable($numbers, $sum) {
    //Sort provided numbers and assign numerical keys.
    asort($numbers);
    $numbers = array_values($numbers);

    //Var for additions and var for number of provided numbers.
    $total = 0;
    $numbers_length = count($numbers);

    //Empty var to fill below.
    $code = '';

    //Loop and add for() loops.
    for ($i = 0; $i < $numbers_length; $i++) {
        $code.= 'for ($n'. $i. ' = 0; $n'. $i. ' < '. $numbers_length. '; $n'. $i. '++) {';

        if ($i != 0) {
            $code.= 'if ($n'. $i. ' != $n'. ($i - 1). ') {';
        }

        $code.= '$total += intval($numbers[$n'. $i. ']);';
        $code.= 'if ($total == $sum) {';
        $code.= 'return true;';
        $code.= '}';
    }

    //Add ending bracket for for() loops above.
    for ($l = 0; $l < $numbers_length; $l++) {
        $code.= '$total -= intval($numbers[$n'. $i. ']);';
        if ($l != 0) {
            $code.= '}';
        }
        $code.= '}';
    }

    //Finally, eval the code.
    eval($code);

    //If "true" not returned above, return false.
    return false;
}

$num_arr = array(1,2,3,4,5,6,7,8,9);
var_dump(is_summable($num_arr, 24));

http://pastebin.com/1nawuwXK

Как всегда помощь приветствуется!!

8
задан vascowhite 13 August 2012 в 11:43
поделиться