Количество способов суммирования суммы S с N номерами

Скажем S = 5 и N = 3, решения будут выглядеть как - < 0,0,5 > < 0,1,4 < 0,2,3 < 0,3,2 <, 5,0,0 < 2,3,0 < 3,2,0 < 1,2,2 > и т.д. и т.д. </p>

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

Если мы не знаем N раньше времени, мы можем использовать рекурсивное решение. На каждом уровне запустите цикл, начиная с 0 до N, а затем снова вызовите функцию. Когда мы достигнем глубины N, посмотрим, добавятся ли полученные числа до S.

Любое другое решение для динамического программирования?

Ответ 1

Попробуйте эту рекурсивную функцию:

f(s, n) = 1                                    if s = 0
        = 0                                    if s != 0 and n = 0
        = sum f(s - i, n - 1) over i in [0, s] otherwise

Чтобы использовать динамическое программирование, вы можете кэшировать значение f после его оценки и проверить, действительно ли значение уже существует в кеше, прежде чем оценивать его.

Ответ 2

Существует формула замкнутого вида: биномиальная (s + n - 1, n)

Эти цифры являются симплексными числами.

Если вы хотите их вычислить, используйте функцию гаммы журнала или арифметику произвольной точности.

См. https://math.stackexchange.com/questions/2455/geometric-proof-of-the-formula-for-simplex-numbers

Ответ 3

У меня есть своя формула для этого. Мы вместе с моим другом Джио сделали следственный отчет по этому поводу. Формула, которую мы получили, составляет [2 raised to (n-1) - 1], где n - это число, которое мы ищем, сколько у него есть.

Попробуй.

  • Если n равно 1: его слагаемые - o. Нет двух или более чисел, которые мы можем добавить, чтобы получить сумму 1 (исключая 0). Попробуйте большее число.
  • Попробуйте 4. 4 has addends: 1+1+1+1, 1+2+1, 1+1+2, 2+1+1, 1+3, 2+2, 3+1. Его общая сумма составляет 7. Пусть проверить формулу. 2, поднятый до (4-1) - 1 = 2, поднятый до (3) - 1 = 8-1 = 7.
  • Пусть try 15. 2 поднят до (15-1) - 1 = 2, поднятый до (14) - 1 = 16384 - 1 = 16383. Следовательно, есть 16383 способа добавить числа, которые будут равны 15.

(Примечание: добавление - это только положительные числа.)

(Вы можете попробовать другие цифры, чтобы проверить, правильна ли наша формула или нет.)

Ответ 4

Это можно рассчитать в O(s+n) (или O(1), если вы не возражаете против approximation) следующим образом

Предположим, что у нас есть строка с n-1 X в ней и s o. Итак, для вашего примера s = 5, n = 3, одна примерная строка будет

oXooXoo

Обратите внимание, что X делит o на три отдельные группы: одну из длины 1, длину 2 и длину 2. Это соответствует вашему решению < 1,2,2 > . Каждая возможная строка дает нам другое решение, подсчитывая число o в строке (возможно 0: например, XoooooX будет соответствовать < 0,5,0 > ). Итак, подсчитав количество возможных строк этой формы, мы получим ответ на ваш вопрос.

Есть s+(n-1) позиции для выбора s o, поэтому ответ Choose(s+n-1, s).

Ответ 5

Это на самом деле очень похоже на проблему Towers of Hanoi, без ограничения на укладку дисков только на более крупные диски. У вас есть S-диски, которые могут быть в любой комбинации на башнях N. Так что заставило меня задуматься.

Я подозреваю, что существует формула, которую мы можем вывести, которая не требует рекурсивного программирования. Мне нужно еще немного времени.

Ответ 6

Существует определенная формула для поиска ответа. Если вы хотите найти количество способов получить N как сумму элементов R. Ответ всегда: (N + R-1)!/((Р-1)! * (N)!) или другими словами: (N + R-1) C (R-1)