我最简单的方法是找出方法的总体可能组合?这是我正在尝试解决的一个示例类;
class Combinations {
public void generate()
{
final int TOTAL_A = 10;
final int TOTAL_B = 21; // TOTAL_B is used twice
final int TOTAL_C = 17;
final int TOTAL_Z = 20;
int count = 0;
for (int a = 0; a < TOTAL_A; a++)
{
for (int b = 0; b < TOTAL_B; b++)
{
for (int b_two = 0; b_two < TOTAL_B; b_two++)
{
for (int c = 0; c < TOTAL_C; c++)
{
for (int one = 0; one < TOTAL_Z; one++)
for (int two = one + 1; two < TOTAL_Z; two++)
for (int three = two + 1; three < TOTAL_Z; three++)
for (int four = three + 1; four < TOTAL_Z; four++)
for (int five = four + 1; five < TOTAL_Z; five++)
count++;
}
}
}
}
System.out.println("Total combinations: " + count);
}
}
如何在不必实际进行循环的情况下找出“计数”的方法是什么?
答案 0 :(得分:0)
外部循环a, b, b_two, c
根本不会影响内部循环中的内容,因此它们只会产生重复因子,
TOTAL_A * TOTAL_B² * TOTAL_C
你与内循环的工作相乘。
内部循环one, two, three, four, five
影响或依赖于其他循环。每个循环决定了封闭循环的范围,所以你自然会在里面工作。
for (int five = four + 1; five < TOTAL_Z; five++)
count++;
因此,最里面的循环增加count
总共TOTAL_Z - 1 - four
次。为简洁起见,我们用TOTAL_Z - 1
表示N
。
four
循环
N - four
four
的增量范围从three+1
到N
,
N N-three-1
∑ (N - four) = ∑ k = (N-three)*(N-three-1)/2
four=three+1 k=0
three
循环(N-three)*(N-three-1)/2
的{{1}}增量为three
,范围从two+1
到N
。设置j = N - three
,即
N-two-1
∑ j*(j-1)/2 = (N-two)*(N-two-1)*(N-two-2)/6
j=0
two
循环(N-two)*(N-two-1)*(N-two-2)/6
的{{1}}增量为two
,范围从one+1
到N
,设置为j = N - two
,提供
N-one-1
∑ j*(j-1)*(j-2)/6 = (N-one)*(N-one-1)*(N-one-2)*(N-one-3)/24
j=0
最后,one
循环执行上述one
的增量,范围从0到N
,给出
N N
∑ (N-one)*(N-one-1)*(N-one-2)*(N-one-3)/24 = ∑ k*(k-1)*(k-2)*(k-3)/24
one=0 k=0
= (N+1)*N*(N-1)*(N-2)*(N-3)/120
(或(N+1) `choose` 5
)在内部循环中一起递增。
N = TOTAL_Z - 1 = 19
,20 `choose` 5 = 15504
,乘以外循环的常数,总共得到1162334880个count
的增量。
这里允许简单计算的关键事实是
m
∑ (n+k) `choose` k = (n+m+1) `choose` m
k=0
答案 1 :(得分:0)
|A| * (|B| choose 2) * |C| * (|Z| choose 5) = 553,492,800
或者,如果您想从两个具有相同尺寸的不同池B1
和B2
中进行选择:
|A| * |B1| * |B2| * |C| * (|Z| choose 5) = 1,162,334,880
其中n choose k
的定义如下:
n!/(k!*(n-k)!)