我必须找到将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。
由于
答案 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;
当前容器可能包含从零到所有项目的任何内容。因此,遍历这些并累计剩余容器的所有组合,这些容器加起来减去当前容器中的项目。