用B个球填充N个数字箱的方法有多少种

时间:2016-03-28 00:36:04

标签: java

假设您有N个垃圾箱,其中每个垃圾箱的容量为K.您还有B个球。所有球可以分配到箱子中的方式有​​多少种?

我正在尝试通过编写一个包含以下参数的函数来解决这个问题:

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

   } 

我有点不确定如何处理这个问题。我知道当N = 0时,答案是0.并且当B = 0时,N> 0。 1,答案是1。

但是,我不确定如何为其他所有组合计算它。我想以递归和动态的方式解决这个问题。

2 个答案:

答案 0 :(得分:2)

这样想:如果你有n个球填充容量为k的b箱,那么你可以在0到k个球之间填充第一个bin(称为数字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;
    }            
}

答案 1 :(得分:0)

一个想法:

创建一个代表Bin的类。它将有一个int表示其中有多少个球。

创建一个名为BinState的类。它将有一个长度为N的箱柜列表。

然后是一个看起来像这样的递归函数。警告,未经测试。

int waysBin(int num_balls, BinState binState) {

    int ways = 0;

    for (int i = 0; i < binState.numberofbins(); i++) {
        BinState deepCopyOfBinState = ?;
        /* I don't know how to make a deep copy in java.
         You will need to make a deep copy because this 
         function modifies the deep copy (adding a ball)
         */
        Bin indexedBin = deepCopyOfBinState.getBinNumber(i);
        if (indexedBin.isUnderCapacity()) {
            indexedBin.addOneBall();
            ways += waysBin(num_balls-1, deepCopyOfBinState);
        } else {
            ways += 1; // maybe
        }

    }

    return ways;
}

然后从上面编写的函数中调用递归函数。