SDNU 1011.盒子与球 第二类stirling数(组合数)

来源:互联网 发布:加强网络舆情管控工作 编辑:程序博客网 时间:2024/04/26 01:15

1011.盒子与球

Description
现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子。则有多少

种放法?


Input

n, r(0 <= n, r <= 10)。


Output

有多少种放法。


Sample Input

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;}




0 0
原创粉丝点击