动态规划题,设 dp[i][j] 表示 i 个人组成 j 组的方案数,分为两种情况:
- 最后一个人自己组成一组 ,前 i - 1 个人组成 j - 1 组,方案数为 dp[i-1][j-1];
- 最后一个人插入前面 j 组中的一组,方案数为 dp[i][j] = dp[i-1][j] * j;
状态转移方程为 dp[i][j] = dp[i-1][j-1] + dp[i-1][j] * j (注意要使用 __int64 或者 long long 类型)
#include <cstdio>
#include <cstring>
const int MAXN = 25;
__int64 dp[MAXN][MAXN];
int main()
{
int C;
scanf("%d", &C);
while (C--)
{
memset(dp, 0, sizeof(dp));
int n;
scanf("%d", &n);
dp[0][0] = 1;
for (int i = 1; i <= n; i++) //动态规划
{
for (int j = 1; j <= n; j++)
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j] * j;
}
__int64 sum = 0; //总方案数
for (int i = 1; i <= n; i++)
sum += dp[n][i];
printf("%I64d\n", sum);
}
return 0;
}
继续加油。