分球
【题目描述】有N个标号的球分到M个无差别的盒子里,每个盒子至少有一个球,问方案数?
【输入文件】
每部分一行两个数N,M。
【输出文件】
每组数据一行一个数,表示方案数。
【样例输入】
4 2
【样例输出】
7
【样例解释】
N=4,M=2
1,2 3 4
2,1 3 4
3,1 2 4
4,1 2 3
1 2,3 4
1 3,2 4
1 4,2 3
【数据规模】
对于20%的数据,满足1=<N,M<=10;
对于100%的数据,满足1=<N,M<=100。
很简单的DP,i个球放在j个盒子里的情况数等于i-1个球放在j个盒子里的情况数×j加上i-1个球放在j-1个盒子中的情况数,相当于第i个球可以放在j个盒子中任意一个,或者第i个球放在第j个新的盒子里。状态转移方程f[i][j]=f[i-1][j]*j+f[i-1][j-1]。注意初始化f[0][0]=1,其余都是0,代码如下
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int f[101][101];
int main()
{
int n,m;
int i,j;
cin >> n >> m;
memset(f,0,sizeof(f));
f[0][0]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if (i<j)
{
f[i][j]=0;
continue;
}
f[i][j]=f[i-1][j]*j+f[i-1][j-1];
}
}
cout << f[n][m] << endl;
return 0;
}