У меня был тест на собеседование, и вопрос, который я получил, состоял в том, чтобы сделать функцию, которая вернет количество способов, с помощью которых число может быть сгенерировано с использованием чисел из определенного набора, и любое число в наборе может использоваться 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;
}
Эта функция работает нормально и возвращает правильное значение. Мой вопрос в том, есть ли лучший способ для этого.
Спасибо