繁体   English   中英

Java内部循环

[英]Java inner for-loop

我必须找到将n个事物分发到k个容器的所有可能性。 容器的大小都应该不同,所以我制作了k个内部for循环来计算每种可能性。 对不起,我的英语解释不好。

适用于3个容器的示例代码:

 for (int i = 0; i < container[0]; i++)
     for (int j = 0; j < container[1]; j++)
         for (int k = 0; k < container[2]; k++)
             if ((i + j + k) == n)
                 Possibilities++; 

现在我需要知道如何使k为循环,以便它适用于2和10。

谢谢

我假设containers容纳每个容器的大小。 也许最简单的解决方案是将不使用的任何容器的大小设置为零。 然后,您可以有(说)10个嵌套循环,但是如果只有2个容器,则将2以上的所有大小都设置为零。

但是,嵌套循环实际上并不是处理此问题的最佳方法。 这很可能是递归的好用法。

private int combinationCount(int[] containerSizes, int from, int total) {
    if (total == 0 || from == containerSizes.length - 1)
        return 1;
    int combinations = 0;
    for (int i = 0; i <= Math.min(total, containerSizes[from]); i++)
        combination += combinationCount(containerSizes, from + 1, total - i);
    return combinations;
}

这可以通过combinationCount(containers, 0, n)来调用。 您可以通过在每次递归调用中复制数组,或者在递归调用中传递一个List然后是一个子列表, from完全删除from变量。

这是我的测试代码,供您参考:

System.out.println(combinationCount(IntStream.range(10, 30).toArray(), 0, 10));

哪个返回20030010

我将解释其工作原理:

if (total == 0 || from == containerSizes.length - 1)
    return 1;

如果剩余容器的总数为零,则只有1个组合,因为所有剩余容器必须为空。 同样,如果只剩下一个容器,则只有1个组合,因为它必须具有所有剩余的物品。

int combinations = 0;
for (int i = 0; i <= Math.min(total, containerSizes[from]); i++)
    combination += combinationCount(containerSizes, from + 1, total - i);
return combinations;

当前容器可能包含从零到所有项目的任何内容。 因此,对那些对象进行迭代并总计剩余容器的所有组合,这些组合加到目标中减去当前容器中的项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM