Description:
现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子。则有多少种放法?
Input:
n, r(0 <= n, r <= 10)。
Output:
有多少种放法?
看起来知觉告诉自己用排列组合来做,实际上用排列组合需要考虑的太多,所以换一种思考方式:递推.
首先屏蔽一个条件->r个盒子互不相同,设定我们将第i个球将要放到第k个盒子里(前i-1个球已经在前k个盒子里放好)于是有如下递推公式:
s[i,k] = s[i-i,k-1]+s[i-1,k]*k
也就是说对于第i个球,当第k个盒子为空时,就必须要放到第k个盒子里,当第k个盒子不为空时,可以任意放到k个盒子其中的一个。
该递推式的初始条件也可以给出s[1,1] = 1; 其余为0;
而后将之前屏蔽的条件加上。(实质就是全排列)
则答案就可以得出了。
程序如下:
#include <stdio.h>
#include <string.h>
long j[11][11];
long a[11] = {1,1,2,6,24,120,720,5040,40320,362880,3628800};
int main(){
memset(j,0,sizeof(j));
j[1][1] = 1;
int r,n;
scanf("%d%d",&n,&r);
for(int i=2;i<=n;i++){
for(int k = 1;k<=r;k++){
j[i][k] = j[i-1][k-1] + j[i-1][k] * k;
}
}
printf("%ld\n",j[n][r] * a[r]);
fflush(stdin);
getchar();
return 0;
}