将n个人分成若干队,每队人数可以是1、2或者3人。
Input
输入包含多组测试数据(约1000组),每组数据占一行,包含一个数字n(0<=n<=20),表示ACM集训队的队员人数;n为0,表示输入结束。
Output
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 <cstdio>
#include <cstring>
#include <algorithm>
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]);
}
}