Java数学,计算总组合

时间:2012-12-17 17:48:04

标签: java math recursion combinations

我最简单的方法是找出方法的总体可能组合?这是我正在尝试解决的一个示例类;

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);
    }

}

如何在不必实际进行循环的情况下找出“计数”的方法是什么?

2 个答案:

答案 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+1N

    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+1N。设置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+1N,设置为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 = 1920 `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

或者,如果您想从两个具有相同尺寸的不同池B1B2中进行选择:

|A| * |B1| * |B2| * |C| * (|Z| choose 5) = 1,162,334,880

其中n choose k的定义如下:

n!/(k!*(n-k)!)