Сумма из чисел массива, наиболее близкая к определенному числу с минимальным остатком

Подскажите правильный алгоритм, или решение на php.

Есть число

x = 112; 

и массив

[20,30,38]

И число, и массив могут меняться.

Мне нужно получить число, максимально близкое к числу X, из суммы элементов массива, при условии, что числа из массива могут повторяться.

То есть из примера, который мне нужен

20+20+20+20+30 = 110 ( остаток 2) 

или

30+30+30+20 = 110 ( остаток 2)

Заранее благодарю вас за совет.


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Элемент $f[$i] содежит истину, если можно построить сумму $i из элементов массива $a. Заполняется слева направо. Сложность count($a) * $t:

<?php

$a = [20, 30, 38];
$t = 112;

$f = [];
for ($i = 0; $i <= $t; ++$i) {
    $f[] = false;
}

$f[0] = true;
for ($i = 0; $i <= $t; ++$i) {
    if ($f[$i]) {
        foreach($a as $v) {
            if ($i + $v <= $t) {
                $f[$i + $v] = true;
            }
        }
    }
}

for ($i = $t; $i >= 0; --$i) {
    if ($f[$i]) {
        echo $i;
        echo "\n";
        break;
    }
}

?>
→ Ссылка