组合问题

组合问题

 

从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三种情况。

 

   

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值