取人 pascal

来源:百度知道 编辑:UC知道 时间:2024/05/17 02:08:26
求N个人选取M个人出来做游戏,共有多少种取法?例如:N=4,M=2时,有12,13,14,23,24,34共六种。
要求输出方案

试着用递归的方法就行了.

var
n,i,s,s1:longint;
a:array[1..maxn]of longint;
b:array[1..maxn]of boolean;
//判断数是否已经输出(判重)

procedure find(x:longint);
var
i:longint;
begin
if x>m then//判断是否已输出一种组合
begin
inc(s);//等效于s:=s+1;
if s<s1 then write(' ');
//如果输出的不是最后一种情况的话,输出空格.
exit;
end;
for i:=1 to n do
begin
if b[i] then
begin
b[i]:=false;//作标记
write(i);
find(x+1);
b[i]:=true;//消除标记
end;
end;
end;

begin
readln(n,m);
s:=0;
s1:=1;
for i:=n-m+1 to n do
s1:=s1*i;
for i:=2 to m do
s1:=s1 div i;
//s1计算共有几种情况,s记录已输出几种情况
fillchar(b,sizeof(b),true);//初始化
find(1);//找寻所有的组合
end.

用公式怎么样?
C:=n!/m!*(n-m)!
阶层运算可以