比赛排名 【组合数】
本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
题目:
比赛排名
(rank.cpp/in/out 1s 128M)
N个同学参加比赛,问有多少种排名情况,允许出现并列的情况
Input
输入一个数字N,N<=12
Output
输出有多少种排名情况
Sample Input
2
Sample Output
3
HINT
设两名同学为A,B,则排名情况有以下三种
1:A第一名,B第二名
2:A第二名,B第一名
3:A,B并列第一名
f(i)表示i个同学参加比赛,问有多少种排名情况,允许出现并列的情况
可以考虑下第一名的几个人,可以有一个人,则结果为c(n,1)*f(n-1) 因为已经取走1人
可以有2个人,则结果为c(n,2)*f(n-2) 因为已经取走2人
可以有3个人,则结果为c(n,3)*f(n-3) 因为已经取走3人
……
可以有n个人,则结果为c(n,n)*f(0) 取走n人
ans等于以上情况进行相加
code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long a[210]; 4 long long C(long long m,long long n)//C (m中取n) 5 { 6 long long ans=1; 7 for(long long i=1;i<=n;i++) 8 ans=ans*(m-i+1)/i; 9 return ans; 10 } 11 signed main() 12 { 13 long long n,t; 14 scanf("%lld",&n); 15 a[1]=a[0]=1; 16 for(long long k=2;k<=n;k++) 17 { 18 for(long long i=1;i<=k;i++) 19 { 20 a[k]+=a[k-i]*C(k,i); 21 } 22 } 23 printf("%lld\n",a[n]); 24 return 0; 25 }