假设您有N个料箱,其中每个料箱的容量为K。您还有B个球。所有球都可以通过几种不同的方式分配到垃圾箱中?

我正在尝试通过编写一个具有以下参数的函数来解决此问题:

public static int waysBin(int ball, int bin, int capacity)
   {
      //code here

   }


我不确定如何解决这个问题。我知道N = 0时的答案是0。而B = 0时N> 1的答案是1。

但是,我不确定如何对其他所有组合进行计算。我想递归和动态地解决这个问题。

最佳答案

这样想:如果您有n个球填充b个容量为k的箱,则可以用0到k个球填充第一个箱(称为数字c)。对于每种可能性,您都可以用n-c个球填充其余的b-1个垃圾箱。如果只有1个垃圾箱,则球数少于容量的情况为一种组合,否则为零。

所以:

int combinations(int ballCount, int binCount, int binSize) {
    if (binCount > 1) {
        return IntStream.rangeClosed(0, Math.min(ballCount, binSize))
            .map(c -> combinations(ballCount - c, binCount - 1, binSize))
            .sum();
    } else {
        return binCount == 0 || ballCount > binSize ? 0 : 1;
    }
}


如果您没有Java 8,请使用:

int combinations(int ballCount, int binCount, int binSize) {
    if (binCount > 1) {
        int combos = 0;
        for (c = 0; c <= Math.min(ballCount, binSize); c++)
            combos += combinations(ballCount - c, binCount - 1, binSize);
        return combos;
    } else {
        return binCount == 0 || ballCount > binSize ? 0 : 1;
    }
}

09-26 19:45