Java内部for循环

时间:2015-11-24 17:33:59

标签: java 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。

由于

1 个答案:

答案 0 :(得分:2)

我假设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)调用此方法。您可以通过在每个递归调用中复制数组或在递归调用中传递from然后传递子列表来完全删除List参数。

以下是我的测试代码:

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

返回20030010

我将解释这是如何工作的:

if (total == 0 || from == containerSizes.length - 1)
    return 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;

当前容器可能包含从零到所有项目的任何内容。因此,遍历这些并累计剩余容器的所有组合,这些容器加起来减去当前容器中的项目。