【问题标题】:Calculating How Many Balls in Bins Over Several Values Using Dynamic Programming [closed]使用动态编程计算多个值的箱子中有多少球[关闭]
【发布时间】:2016-07-14 19:26:59
【问题描述】:

关于将 N 个相同的球放入 M 个不同的箱子并打印所有组合的经典问题:如果您想通过打印所有案例来扩展问题0< M, N 蛮力方法可以这样做:

for (int i =0; i<M; i++)
{  
   for (int j =0; j <N; j++)
   {
        PrintAllCombinations(j,i)
   }
}

现在,如果我们研究前一对 m 和 n 的输出,我们会发现前一次迭代的输出是下一次迭代的子集。在我看来,我们可以应用动态算法来利用这种现象。但是,因为我们仍然需要对每个n 进行分区,例如n=3 = 3 +0, 2+1, 1+2。我们仍然需要做很多冗余的组合计算。
有什么想法可以改进吗?

【问题讨论】:

  • 使用递归方法。您的代码仅适用于两个级别 (i,j) 而不是 (i,j,k.l,....)。
  • 不确定是作业转储还是真正的问题。

标签: java c# c algorithm dynamic-programming


【解决方案1】:

S[i][j]i 球在j 箱中的组合数。

S[0][j] = 1 用于所有 j,因为唯一的组合是让所有 bin 为空。

S[i][1] = 1 对于所有 i,因为唯一的组合是将所有球放入一个容器中。

对于每个其他 i,j S[i][j] = sum(x = 0 -&gt; i, S[i-x][j-1])。也就是说,对于每个其他位置,您可以通过将每个可能数量的球分配到最后一个箱中来计算组合的数量,并对您获得的组合数量求和。

如果要打印出组合,可以将计数替换为实际组合,并在求和时附加值x。这将占用大量内存,而速度却没有很大提高。只需进行递归并重复计算,因为无论如何您都会受到解决方案数量的限制。

【讨论】:

    猜你喜欢
    • 2019-07-24
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2016-02-06
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多