杭电校赛2015‘11 1005

ACM组队安排

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1051 Accepted Submission(s): 512

Problem Description
ACM亚洲区比赛结束,意味着开始备战明年的浙江省大学生程序设计竞赛了!
杭州电子科技大学ACM集训队也准备开始组队。
教练想把所有的n个队员组成若干支队伍,原则是每支队伍至少一人,最多三人。
现在问题来了:如果已知集训队队员的数量n,请你帮教练计算出所有可能的组队方案有多少种。

特别说明:
队伍没有编号,即如果有A,B,C三人,{A}{BC}与{BC}{A}是同一种组队情况。

Input
输入包含多组测试数据(约1000组),每组数据占一行,包含一个数字n(0<=n<=20),表示ACM集训队的队员人数;n为0,表示输入结束。

Output
请输出n个队员所有可能的组队方案数,每组输出占一行。

Sample Input
1
2
3
4
5
0

Sample Output
1
2
5
14
46

数学题。打了一发表

#include"cstring"
#include"string.h"
#include"iostream"
#include "cstdio"
#include "cmath"
using namespace std;


typedef unsigned uint;
uint CC(uint n, uint r)
{
    uint Anr = 1;
    uint Arr = 1;

    for(; r > 0; Anr *= n--, Arr *= r--);

    return Anr / Arr;
}

int AA(int a)
{
    int temp=1;
    while(a>=1)
    {
        temp*=a;
        a--;
    }
    return temp;
}



int main()
{
    int people=1;
    long long ans=0;
    int cnt=1;
    long long store[25];
    for(;people<=20;people++)
    {
        ans=0;
        for(int i=0;i<=people;i++)
        {
            for(int j=0;j<=people;j++)
            {
                for(int k=0;k<=people;k++)
                {
                    if(3*i+2*j+k==people)
                    {
                        int total=people;
                        total=people;
                        long long ans1=1,ans2=1,ans3=1;
                        if(i>=1)
                            ans1=1;
                        if(j>=1)
                            ans2=1;
                        for(int o=1;o<=i;o++)
                        {
                            ans1*=CC(total,3);
                            total-=3;
                        }
                        for(int o=1;o<=j;o++)
                        {
                            ans2*=CC(total,2);
                            total-=2;
                        }
                        if(i==0&&j==0&&k>=1)
                        {
                            ans++;
                            continue;
                        }
                        ans+=ans1/AA(i)*ans2/AA(j)*ans3;
                    }
                }
            }
        }
        //printf("people:%d %lld\n",people,ans);
        store[cnt++]=ans;
    }
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
            return 0;
        printf("%lld\n",store[n]);
    }
}

你可能感兴趣的:(杭电校赛2015‘11 1005)