这道题有点儿难度,但是难度也只算一般,不明白一道汉语题目,意思简单通俗易懂,结果提交量就那么点儿。
考虑一支队伍分组的数目,如果这支队伍有n个人,就有n种情况分别是一个组,两个组。。。。
i个人分成j组有两种方式,一种是i-1个人分成j-1组之后,第i个人独立分成一组,另一种情况是i-1个人分成j组,第i个人随便加入j组中的任何一组,也都符合条件。状态转移方程为f[i][j]=f[i-1][j-1]+f[i-1][j]*j。直接将数据打表,计算结果的时候只要将i等于n的所有情况相加。
需要注意的是结果的值非常大,需要用__int64去存。
[cpp] #include
#include
#define N 30
int main()
{
__int64 f[N][N];
int i,j;
int n;
memset(f,0,sizeof(f));
f[1][1]=1;
f[1][0]=0;
for(i=2; i<25; i++)
{
f[i][0]=0;
f[i][1]=1;
for(j=1; j<25; j++)
{
if(i==j)
{
f[i][j]=1;
continue;
}
f[i][j]=f[i-1][j-1]+f[i-1][j]*j;
}
}
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
__int64 sum;
sum=0;
for(i=1; i<=n; i++)
sum+=f[n][i];
printf("%I64d\n",sum);
}
return 0;
}