1011.盒子与球
Description
现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子。则有多少
种放法?
n, r(0 <= n, r <= 10)。
有多少种放法。
3 2
Sample Output
6
当时刚入坑的时候SDNU前面一道一直没能A的题.....看题意就是数学里面排列组合的问题= =表示高中时候对这概念一直很混乱,所以该怎么做一直没找到方法,现在又把这个题翻了出来直接百度了下,有一个第二类stirling数,是说将n个不同的球放到k个相同的盒子,每个盒子不为空,共有S(n,k)种方法,这个就是第二类stirling数。而这个题目是有r个互不相同的盒子,所以最后用第二类stirling数算出来后还要乘以r的阶乘。因为这题数据比较小,只是到10而已,所以先打个表然后需要哪个输出哪个就好了。
下面AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[15][15];
int SecondStringData()
{
int i,j;
memset(dp,0,sizeof(dp));
for(i=1;i<12;i++)
{
dp[1][i]=0;
dp[i][1]=1;
}
for(i=2;i<12;i++)
{
for(j=1;j<=i;j++)
{
dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*j;
}
}
return 0;
}
int main()
{
int i;
int t;
int n,r;
SecondStringData();
while(scanf("%d%d",&n,&r)!=EOF)
{
t=1;
for(i=1;i<=r;i++)
{
t=i*t;
}
cout<<dp[n][r]*t<<endl;
}
return 0;
}