组合问题

组合问题

 

从ABCD中任意选取2个字符的情况?

 

法1:常规法

任取1个字符的情况:

       A                 B                 C                D  

基于上面产生的五个子集,从剩余字符中选取第2个字符:

B     C     D       A    C    D       A    B    D       A   B    C

判断是否已经选择了题目要求的字符的个数,例如此时已经选择了2个字符,满足了题目,则不再往下求解,否则重复上面步骤继续往下求。

 

法2:公式法

大家应该对二项式系数有比较深的了解,例如(x+y)^2=x^2+2xy+y^2.对应的系数为1 2 1

(x+y)^3=x^3+3yx^2+3xy^2+y^3.对应的系数为1 3 3 1

正好对应了一个神奇的三角,名曰“杨辉三角”

              1

             1 1

            1 2 1

           1 3 3 1

          1 4 6 4 1

        1 5 10 10 5 1

 

大家也许会疑惑,为啥讲这些?大家继续往下看。

组合公式: 4C2 = 3C1 + 3C2

大家对照上面的三角形第四行第二个元素3,它等于第三行的第一个元素和第二个元素的和。以此类推。

 

因此根据上述公式,组合问题求解又有另一种解法,如下:

source[]:ABCD
temp[]:temporal array

cb(n,r)
{
    if(r == 0)
        print temp
    else if (n<r)
        return
    else
        temp[r-1]=an[n-1]
        cb(n-1, r-1)
        cn(n-1, r)
}

 

 

这里n表示总数,r表示选取几个


可能对于temp[r-1]=an[n-1] 有人无法理解,尝试跟踪代码运行ABC,3C2即可三个中任选两个,即可得出AB  AC  BC三种情况。

 

   

 

posted @ 2015-12-24 20:22  xfei.zhang  阅读(130)  评论(0编辑  收藏  举报