Рекурсивная функция для определения количества способов, с помощью которых число может быть сформировано из набора чисел

У меня был тест на собеседование, и вопрос, который я получил, состоял в том, чтобы сделать функцию, которая вернет количество способов, с помощью которых число может быть сгенерировано с использованием чисел из определенного набора, и любое число в наборе может использоваться N раз.

Это похоже на то, что у меня есть число 10, и я хочу узнать, сколько способов 10 может быть сгенерировано с использованием [2,3,5]

2 + 2 + 2 + 2 + 2 = 10 5 + 3 + 2 = 10 2 + 2 + 3 + 3 = 10 5 + 5 = 10

для его решения Я сделал эту функцию:

function getNumberOfWays($money, $coins) {
    static $level = 0;
    if (!$level) {
        sort($coins);
    }

    if ($level && !$money) {
        return 1;
    } elseif (!$level && !$money) {
        return 0;
    }

    if ($money === 1 && array_search(1, $coins) !== false) {
        return 1;
    } elseif ($money === 1 && array_search(1, $coins) === false) {
        return 0;
    }

    $r = 0;
    $tmpCoins = $coins;
    foreach ($coins as $index => $coin) {
        if (!$coin || $coin > $money) {
            continue;
        }

        $tmpCoins[$index] = 0;
        $tmpMoney = $money;
        do {
            $tmpMoney -= $coin;
            if ($tmpMoney >= 0) {
                $level++;
                $r += getNumberOfWays($tmpMoney, $tmpCoins);
                $level--;
            } elseif (!$tmpMoney) {
                $r++;
            }
        } while ($tmpMoney >= 0);
    }

    return $r;
}

Эта функция работает нормально и возвращает правильное значение. Мой вопрос в том, есть ли лучший способ для этого.

Спасибо

0
задан 13 August 2018 в 13:54

0 ответов

Другие вопросы по тегам:

Похожие вопросы: