Java 用B个球填充N个箱子有多少种不同的方法
假设你有N个箱子,每个箱子的容量是K。你也有B个球。有多少种不同的方式可以将所有的球分配到垃圾箱中 我试图通过编写一个包含以下参数的函数来解决此问题:Java 用B个球填充N个箱子有多少种不同的方法,java,Java,假设你有N个箱子,每个箱子的容量是K。你也有B个球。有多少种不同的方式可以将所有的球分配到垃圾箱中 我试图通过编写一个包含以下参数的函数来解决此问题: public static int waysBin(int ball, int bin, int capacity) { //code here } 我有点不确定如何处理这个问题。我知道当N=0时,答案是0。当B=0,N>1时,答案是1 然而,我不知道如何计算每一个其他组合。我想递归和动态地解决这个问题。一个想法:
public static int waysBin(int ball, int bin, int capacity)
{
//code here
}
我有点不确定如何处理这个问题。我知道当N=0时,答案是0。当B=0,N>1时,答案是1
然而,我不知道如何计算每一个其他组合。我想递归和动态地解决这个问题。一个想法:
创建一个类来表示一个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;
}
int-waysBin(int-num_-balls,bin-state){
int-ways=0;
对于(int i=0;i
然后从上面编写的函数中调用递归函数。这样想:如果有n个球填充容量为k的b个容器,那么可以用0到k个球填充第一个容器(称为数字c)。对于这些可能性,您可以用n-c球填充剩余的b-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;
}
}
int组合(int ballCount、int binCount、int binSize){
如果(binCount>1){
整数组合=0;
对于(c=0;c尺寸为0:1;
}
}
当B好的时候,你想要的技术术语是,你可以找到很多关于这方面的例子。我正在尝试用编程的方式解决前面提到的组合数学问题。我想我应该能够把它包含在一个函数中,有三个参数,对吗?通过让所有的检查都在一个函数中,然后调用递归我打电话给你。最难的部分是箱子的最大容量。这是一个更好的方法。我认为你需要将binCount>1时计算的结果乘以你可以选择的箱子数量。@Karl不,这个算法将箱子视为不同的,不能互换。如果你乘以箱子数量,你会得到太多的组合。@sprinter我是tr我想把它编码出来,但我以前从未使用过IntStream(不知道导入什么来使用它)。有没有办法用传统的循环来计算它?我似乎没有java.util.stream支持。这是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;
}
}