[英]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.