例如,我有长度为n = 3的数组:
for(int i = 0; i < n; i++) {
array[i] = i;
}
所以案件应该是:
1. 0
2. 1
3. 2
4. 0 1
5. 0 2
6. 1 2
7. 0 1 2
因此n = 3时病例数应为7。 在我的代码中:
int n = 3;
int[] array = new int[n];
for (int i = 0; i < n; i++) {
array[i] = i;
}
int sum = 0;
for (int i = 0; i < n; i++) {
System.out.println(array[i] + " ");
sum++;
for (int j = i; j < n; j++) {
System.out.print(array[j] + " ");
}
System.out.println();
sum++;
}
System.out.println("sum = " + sum);
输出是:
0
0 1 2
1
1 2
2
2
sum = 6
数字2是两次,所以它是错误的,总和实际上是= 5.而且我没有得到案件
4. 0 1
and
5. 0 2
如何计算所有可能的案例?
答案 0 :(得分:1)
第一个重要的注意事项是你不是在这里使用固定长度数组,而是使用不同长度的设置。
看看你的例子。你允许
0
1
2
0, 1
0, 2
1, 2
不是全部大小3
。
另外,你不能区分
0, 1
1, 0
所以顺序并不重要,例如集。
这就是你在这里实际描述power sets的原因。对于示例集{0, 1, 2}
,其功率集定义为
P({0, 1, 2}) = {
{}, // empty set
{0},
{1},
{2},
{0, 1},
{0, 2},
{1, 2},
{0, 1, 2}
}
幸运的是,它们的大小有一个简单的封闭公式。如果n
是输入集的大小,则功率集的大小为
2^n
但他们也会计算空集,因此如果您不想要,则需要-1
:
2^n - 1
因此在Java中你可以编写
int Set<Integer> input = ...
int size = (int) Math.pow(2, input.size()) - 1;
和全部,您不需要手动构建内容。
但是,如果您有点好奇并想要构建它们,请查看Obtaining a powerset of a set in Java之类的问题。它是维基百科上显示的递归公式的实现。
所以,完全没效率,但也在工作:
int Set<Integer> input = ...
// Build the power-set using the method from linked question
Set<Set<Integer>> power = powerSet(input);
int size = power.size() - 1;