一、常考点
含有相同元素的全排列:例如2个a,3个b,4个c可以组成多少个不同的字符串?9!/2!/3!/4!。
n个人的全排列:排成一排为n!,排成一圈且考虑旋转带来的差异也为n!,
排成一圈但不考虑旋转差异则为(n-1)!。
二、普通排列组合练习题
1、X*Y的方格阵中,从左上角走到右下角,每次只能走一格且只能向右走或向下走,有多少种走法
解法:向右一定走Y-1步,向下一定走X-1步,总共要走X+Y-2步,走法有C(X+Y-2,X-1)种。
当n<=10时:
组合数的计算方法一(利用递归公式):
class
Robot {
public
:
int
C(
int
n,
int
m) {
if
(m ==
1
)
return
n;
if
(m == n || m ==
0
)
return
1
;
return
C(n-
1
,m-
1
)+C(n-
1
,m);
}
int
countWays(
int
x,
int
y) {
return
C(x+y-
2
,x-
1
);
}
};
public :
int
countWays(
int
x,
int
y) {
int
n1 =
1
,n2 =
1
;
for
(
int
i =
1
,j = x+y-
2
;i <= x-
1
;i++,j--) {
n1 *= i;
n2 *= j;
}
return
n2/n1;
}
};