使用动态规划将球分配到具有给定容量的“箱”中

时间:2011-10-05 14:05:10

标签: algorithm combinatorics dynamic-programming

我想知道如何使用DP来解决这个问题。

给定n个球和m个箱子,每个箱子有最大值。容量c1,c2,... cm。将这些n球分配到这些m箱中的总方式是多少。

我面临的问题是

  1. 如何找到递归关系(当容量都是单个常数c时,我可以。)
  2. 将会有几个测试用例,每个测试用例都有自己的c1,c2 .... cm。那么DP如何实际应用于所有这些测试用例,因为答案明确取决于当前的c1,c2 .... cm,并且我无法存储(或预先计算)c1,c2的所有组合的答案。 ...厘米。
  3. 此外,我也无法针对这个问题提出任何直接的组合公式,我也不认为存在这样的公式。

2 个答案:

答案 0 :(得分:1)

  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)

  2. 这个等式的递归非常简单 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.

  3. 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] + ...那么你知道没有搜索没有解决方案(你可以预先计算部分和)。