组合数学(洛谷)

组合计数

p1287盒子与球

题意:

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

数据范围:

对于 100% 的数据,保证 0 ≤rn≤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;
}
发布了75 篇原创文章 · 获赞 8 · 访问量 1247

猜你喜欢

转载自blog.csdn.net/qq_40905284/article/details/105021935