我想知道如何使用DP来解决这个问题。
给定n个球和m个箱子,每个箱子有最大值。容量c1,c2,... cm。将这些n球分配到这些m箱中的总方式是多少。
我面临的问题是
此外,我也无法针对这个问题提出任何直接的组合公式,我也不认为存在这样的公式。
答案 0 :(得分:1)
存在针对此问题的组合公式。找到问题解决方案的问题等同于找到方程式的解的数量
x1 + x2 + x3 + ... + xm = n
where xi < ci
Which is equivalent to finding the cofficient of x^n in the following equation
(1+x+..x^c1)(1+x+..+x^c2)...(1+x+...+x^cm)
这个等式的递归非常简单
M(i,j) = summation(M(i-1, j-k)) where 0<= k <= cj
M(i,j) = 0 j <= 0
M(i,1) = i given for every 1= 1
M(i,j) is the number of ways of distributing the j balls in first i bins.
醇>
For the Dynamic Programming part Solve this recursion by Memoization, You will get your DP Solution automatically.
答案 1 :(得分:1)
您可以定义您的函数,假定限制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
然后你需要添加memoization(这将等同于DP方法)和其他一些优化,例如:如果n > c[k] + c[k+1] + c[k+2] + ...
那么你知道没有搜索没有解决方案(你可以预先计算部分和)。