组合计数
p1287盒子与球
题意:
现有 r 个互不相同的盒子和 n 个互不相同的球,要将这 n 个球放入r 个盒子中,且不允许有空盒子。请求出有多少种不同的放法。
数据范围:
对于 100% 的数据,保证 0 ≤r≤n≤10,且答案小于 2^31.
分析:
n个球,从中取出一个球,有俩种放法,1)bi独占一个盒子,那么剩下的球只能放在m-1个盒子中,f(n-1,m-1). 2)bi与别的球公用一个盒子,那么事先将n-1个球放入m个盒子,f(n-1,m)*m。
边界条件:
1)盒子小于0 ,不能构成方案
2)球数小于盒子数,不能构成方案
3)球数等于盒子数,一种方案
代码:
#include <iostream>
using namespace std;
#define ll long long
//阶乘
ll fac(int i)
{
if(i==1)
return 1;
else
return i*fac(i-1);
}
ll f(int n,int m)
{
if(m<=0 || n<m)
return 0;
if(n==m) return 1;
else return f(n-1,m-1)+f(n-1,m)*m;
}
int main()
{
ll n,m;
cin>>n>>m;
cout<<f(n,m)*fac(m);
return 0;
}