新生晚会
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6751 Accepted Submission(s): 2388
Problem Description
开学了,杭电又迎来了好多新生。ACMer想为新生准备一个节目。来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法?
Input
数据的第一行包括一个正整数T,接下来有T组数据,每组数据占一行。
每组数据包含两个整数N(来报名的人数,1<=N<=30),M(节目需要的人数0<=M<=30)
每组数据包含两个整数N(来报名的人数,1<=N<=30),M(节目需要的人数0<=M<=30)
Output
每组数据输出一个整数,每个输出占一行
Sample Input
5
3 2
5 3
4 4
3 6
8 0
Sample Output
3
10
1
0
1
Source
题目一看就想到了C(a,b) = C(a - 1,b) +C(a - 1,b - 1)
一个数学问题。。。。。
之后想到DP解决。。。。。
上代码
View Code
上代码
先用数学方法解决下...... # include<iostream> # include<cstdio> using namespace std; int main() { int t,n,m,i; double sum; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); if(n<m) { printf("0 "); continue; } sum=1; for(i=1;i<=m;i++) sum*=(n+1-i)/(double)i;//关键 printf("%.0f ",sum); } return 0; } 来个DP #include <iostream> using namespace std; int pailie[31][31]; int main() { int T; cin>>T; for (int i=0; i<T; i++) { int N,M; cin>>N>>M; if(N<M) cout<<0<<endl; else { if(M>N/2) M=N-M; for (int j=0; j<31; j++) { pailie[j][0]=1; } pailie[0][1]=0; for (j=1; j<=N; j++) { for (int k=0; k<=j; k++) { pailie[j][k]=pailie[j-1][k]+pailie[j-1][k-1]; } } cout<<pailie[N][M]<<endl; } } }