【组合数学】盒子与球

盒子与球

Time Limit:1000MS  Memory Limit:65536k

Description

现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子。问有多少种方法?
例如:有2个不同的盒子(分别编为1号和2号)和3个不同的球(分别编为1、2、3号),则有6种不同的方法:

Input

两个整数,n和r,中间用空格分隔。(0≤n, r≤10)

Output

仅一行,一个整数(保证在长整型范围内)。表示n个球放入r个盒子的方法。

 

Sample Input

3 2

Sample Output

6


分析:
可以设f(i,j)表示i个球放入j个箱子,
那么可以推导出f(i,j)=f(i-1,j)*j+f(i-1,j-1);
因为有i个球,j个盒子可以由有i-1个球,j个盒子推倒出来
i-(i-1)=1,那么要将这多出来或者说加上去的球任意放到一个盒子里
那么有多少这样的盒子呢,目前是有j个,所以第一项是f(i-1,j)*j
但这还不够,我们没法考虑少一个箱子的复杂情况,所以只能是箱子和球各少一个
那么最后我们可以在箱子之间任意调换,由于是互不相同,所以乘上一个箱子个数的阶乘就可以了

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int M,N;
int f[11][11];
int num=1;
int main(){
	cin>>N>>M;
	for(int i=1;i<=M;i++) num*=i;
	for(int i=1;i<=N;i++) f[i][1]=1;
	for(int i=2;i<=N;i++)
	    for(int j=2;j<=M;j++)
	        f[i][j]=f[i-1][j]*j+f[i-1][j-1];
	cout<<f[N][M]*num;
}
 
posted @ 2016-12-18 18:41  wxjor  阅读(409)  评论(0编辑  收藏  举报