首先给出杨辉三角(也叫帕斯卡三角形数阵,但我们中国比他早300年)如上图,可以发现三角两边都是1,而中间的数都是上面两个数的和,满足dp[i][j]=dp[i-1][j]+dp[i-1][j-1]这样的递推关系。
然后再来看
(
a
+
b
)
n
(a+b)^{n}
(a+b)n,将它展开会得到:
(
a
+
b
)
0
=
1
(a+b)^{0}=1
(a+b)0=1
(
a
+
b
)
1
=
a
+
b
(a+b)^{1}=a+b
(a+b)1=a+b
(
a
+
b
)
2
=
a
2
+
2
a
b
+
b
2
(a+b)^{2}=a^{2}+2ab+b^{2}
(a+b)2=a2+2ab+b2
(
a
+
b
)
3
=
a
3
+
3
a
2
b
+
3
a
b
2
+
b
3
(a+b)^{3}=a^{3}+3a^{2}b^{}+3a^{}b^{2}+b^{3}
(a+b)3=a3+3a2b+3ab2+b3
可以发现每项前面的系数和杨辉三角中的数字很吻合。我们再来看二项式定理:
(
a
+
b
)
n
=
∑
k
=
0
n
C
n
k
a
n
−
k
b
k
(a+b)^{n}=\sum_{k=0}^{n} C^{k}_{n}a^{n-k}b^{k}\qquad
(a+b)n=∑k=0nCnkan−kbk
那么二项式定理表示的是什么意义呢,首先这相当于n个(a+b)相乘,那么在每个括号里肯定要选出a或者b来和另外几个括号中的a或者b来相乘,那么有多少种情况呢,我们假设在这n个括号中选择了k个b,那么剩下的就是n-k个a了,情况总数是
C
n
k
C^{k}_{n}
Cnk或者
C
n
n
−
k
C^{n-k}_{n}
Cnn−k根据组合数的性质,这两个数是相等的。
然后我们就可以证明下面这个等式:
C
n
m
=
C
n
−
1
m
−
1
+
C
n
−
1
m
C^{m}_{n}=C^{m-1}_{n-1}+C^{m}_{n-1}
Cnm=Cn−1m−1+Cn−1m
这个可以这么理解一下:
在n件物品中选出m件物品有多少种可能性?
答案是:从n-1件中选出m-1件的可能性+从n-1件中选出m件的可能性。(第m件物品可选可不选)
这和上面杨辉三角形有非常密切的联系,和其所满足的递推式也异常相似。(证明好长,明白就好了。。)
通过这个等式我们可以推出所有的组合数。
for(int i=1;i<=1000;i++)
{
c[i][0]=1;c[i][i]=1;
for(int j=1;j<i;j++)
c[i][j]=c[i-1][j]+c[i-1][j-1];
}
很明显时间复杂度
O
(
n
2
)
O(n^{2})
O(n2)
但还有一个可以求非常小范围组合数的等式:
C
n
k
=
n
−
k
+
1
k
C
n
k
−
1
C^{k}_{n}=\frac{n-k+1}{k}C^{k-1}_{n}
Cnk=kn−k+1Cnk−1
下面是证明过程:
C
n
k
=
n
!
k
!
(
n
−
k
)
!
C^{k}_{n}=\frac{n!}{k!(n-k)!}
Cnk=k!(n−k)!n!
=
n
(
n
−
1
)
(
n
−
2
)
.
.
.
.
(
n
−
k
+
1
)
k
(
k
−
1
)
!
=\frac{n(n-1)(n-2)....(n-k+1)}{k(k-1)!}
=k(k−1)!n(n−1)(n−2)....(n−k+1)
=
n
−
k
+
1
k
n
!
(
k
−
1
)
!
(
n
−
k
+
1
)
!
(
上
下
同
乘
(
n
−
k
+
1
)
!
)
=\frac{n-k+1}{k}\frac{n!}{(k-1)!(n-k+1)!}(上下同乘(n-k+1)!)
=kn−k+1(k−1)!(n−k+1)!n!(上下同乘(n−k+1)!)
=
n
−
k
+
1
k
C
n
k
−
1
=\frac{n-k+1}{k}C^{k-1}_{n}
=kn−k+1Cnk−1
int n;
cin>>n;
c[0]=1;
for(int i=1;i<=n;i++) c[i]=c[i-1]*(n-i+1)/i;\\先乘后除