Вы можете определить свою функцию, предполагая ограничения c[0]
, c[1]
, ... c[m-1]
как фиксированные, а затем записать рекурсивную формулу, которая возвращает количество способов, которыми вы можете распределить n шариков в ячейки начинаяпо индексу k .При таком подходе базовая формула просто
def solutions(n, k):
if n == 0:
return 1 # Out of balls, there's only one solution (0, 0, 0, 0 ... 0)
if k == m:
return 0 # Out of bins... no solutions
total = 0
for h in xrange(0, min(n, c[k])+1): # from 0 to c[k] (included) into bin k
total += solutions(n - h, k + 1)
return total
, тогда вам нужно добавить памятку (это будет эквивалентно подходу DP) и некоторые другие оптимизации, например, например, если n > c[k] + c[k+1] + c[k+2] + ...
, то вы знаете, что нетрешения без необходимости поиска (и вы можете предварительно вычислить частичные суммы).