Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用B个球填充N个箱子有多少种不同的方法_Java - Fatal编程技术网

Java 用B个球填充N个箱子有多少种不同的方法

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 然而,我不知道如何计算每一个其他组合。我想递归和动态地解决这个问题。一个想法:

假设你有N个箱子,每个箱子的容量是K。你也有B个球。有多少种不同的方式可以将所有的球分配到垃圾箱中

我试图通过编写一个包含以下参数的函数来解决此问题:

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;
    }            
}