题目:http://acm.hdu.edu.cn/showproblem.php?pid=2512
AC代码(C++):
#include <iostream> #include <queue> #include <string> #include <algorithm> #include <math.h> #define INF 0x3f3f3f3f #define eps 1e-8 using namespace std; int dp[2005][2005]; int main() { int t; cin >> t; for (int i = 0; i <= 2000; i++)dp[i][i] = 1,dp[i][0] = 0; for (int i = 2; i <= 2000; i++) { for (int j = 1; j < i; j++) { dp[i][j] = (dp[i - 1][j - 1] + j*dp[i - 1][j]) % 1000; } } while (t--) { int n; cin >> n; int ans = 0; for (int i = 1; i <= n; i++)ans = (ans + dp[n][i]) % 1000; cout << ans << endl; } //system("pause"); }总结: 动态规划. dp[i][j]表示i个物品分成j堆有多少种分法, dp[i][j]=dp[i-1][j-1]+j*dp[i-1][j]. 第一部分表示第i个物品自己就是一堆, 第二部分表示第i个物品放到别的堆里面. 这样的递推产生的数字叫贝尔数. (所以有些题目可以把前几个数算出来, 然后百度下是什么递推...)