C:动态规划之分组问题

将n个人分成若干队,每队人数可以是1、2或者3人。

已知n,求组队方案数。

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

记dp[i]为i个人分组的方案数。显然dp[1]=1,dp[2]=2,dp[3]=5。i>=4时,考虑最后一个人,他可以一人一队,对方案数的贡献是dp[i-1];也可以和另外i-1人中的一人组队,贡献是C(i-1,1)xdp[i-2];还可以和另外i-1人中的两人组队,贡献是C(i-1,2)xdp[i-3],所以dp[i]=dp[i-1]+C(i-1,1)xdp[i-2]+C(i-1,2)xdp[i-3]。注意数据量会爆int,要用long long。

#include 
#include 
#include 
using namespace std;

long long a[30];

int main()
{
    a[1]=1;
    a[2]=2;
    a[3]=5;
    for(int i=4;i<=20;i++)
        a[i]=a[i-1]+(i-1)*a[i-2]+(i-1)*(i-2)/2*a[i-3];
    int n;
    while(scanf("%d", &n), n){
        printf("%lld\n", a[n]);
    }
}

你可能感兴趣的:(C:动态规划之分组问题)