Эта проблема может быть решена теоретически с помощью производящих функций .Генерирующая функция не является функцией и ничего не генерирует (доброе имя, а?), Но она очень хорошо отслеживает информацию.В результате ответ на вашу проблему состоит в том, что число путей равно коэффициенту x^100
при расширении
1/(1-x^2) * 1/(1-x^5) * 1/(1-x^10) * 1/(1-x^20) * 1/(1-x^50)
Вот объяснение, почему.Напомним, что 1/(1-x) = 1 + x + x^2 + x^3 + ...
.Это основная генерирующая функция, которую мы собираемся использовать для решения проблемы.
Учтите, что у вас есть числа A, B, ..., N (в вашем примере они равны 2,5,10, 20,50), что вы можете повторить любое количество раз.Затем рассмотрим (производящую) функцию
f(x) = 1/(1-x^A) * 1/(1-x^B) * ... * 1/(1-x^N)
Коэффициент x^M
в f(x)
представляет собой количество способов записать M
как сумму вида
M = a*A + b*B + ... + n*N
, где a,b,...,n
- неотрицательные целые числа.
Почему это работает? Поскольку любой мономиальный термин в расширении f(x)
происходит от взятия одного термина из 1/(1-x^A)
, который будет выглядеть как x^(a*A)
для некоторого неотрицательного a
,и аналогично для других терминов.Поскольку показатели добавляются, коэффициент x^M
- это все способы составления такой суммы, чтобы получить M
.
Я знаю, что это не программный ответ, но, надеюсь, вы сможете использовать эту идею длянаписать программу.