现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子。则有多少种放法?
#include<bits/stdc++.h>
using namespace std;
int dp[15][15];
int sd()
{
int i,j;
for(i=1;i<11;i++)
{
dp[1][i]=0;
dp[i][1]=1;
}
for(i=2;i<11;i++)
{
for(j=1;j<=i;j++)
{
dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*j;
}
}
return 0;
}
int jie(int x)
{
if(x==1||x==0)return 1;
return x*jie(x-1);
}
int main()
{
int i;
int t;
int n,r;
sd();
while(cin>>n>>r)
cout<<dp[n][r]*jie(r)<<endl;
return 0;
}
第二类stirling数,是说将n个不同的球放到k个相同的盒子,每个盒子不为空,共有S(n,k)种方法,这个就是第二类stirling数。而这个题目是有r个互不相同的盒子,所以最后用第二类stirling数算出来后还要乘以r的阶乘。