假设您有N个垃圾箱,其中每个垃圾箱的容量为K.您还有B个球。所有球可以分配到箱子中的方式有多少种?
我正在尝试通过编写一个包含以下参数的函数来解决这个问题:
public static int waysBin(int ball, int bin, int capacity)
{
//code here
}
我有点不确定如何处理这个问题。我知道当N = 0时,答案是0.并且当B = 0时,N> 0。 1,答案是1。
但是,我不确定如何为其他所有组合计算它。我想以递归和动态的方式解决这个问题。
答案 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;
}
然后从上面编写的函数中调用递归函数。