组合问题
从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三种情况。