hdu_2519新生晚会(DP)

新生晚会

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)
 
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解决。。。。。
上代码
先用数学方法解决下......
# 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;
        }
    }
}
View Code


原文地址:https://www.cnblogs.com/sxmcACM/p/3346282.html