题目描述
现有 rr 个互不相同的盒子和 nn 个互不相同的球,要将这 nn 个球放入 rr 个盒子中,且不允许有空盒子。请求出有多少种不同的放法。
两种放法不同当且仅当存在一个球使得该球在两种放法中放入了不同的盒子。
输入格式
输入只有一行两个整数,分别代表 n 和 r。
输出格式
输出一行一个整数代表答案。
输入输出样例
输入 #1
3 2
输出 #1
6
import java.util.*;
public class Main {
public static void main(String[] args) {
new Main().sf();
}
int n = 0, m = 0, t = 0;
int[][] a = new int[110][110];
public void sf() {
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
a[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
a[i][j] = a[i-1][j-1] + j*a[i-1][j];
}
}
System.out.println(a[n][m]*pd(m));
}
public int pd(int k) {
int ans = 1;
for (int i = 2; i <= k; i++) {
ans*=i;
}
return ans;
}
}
我们用f(i,j)表示在j个盒子里放入i个球(盒子不加区分)的方法数
将前i-1个球放入j个盒子里,再把第i个球任意放入一个盒子里
将前i-1个球放入j-1个盒子里,再把第i个球单独放入一个盒子里
所以:
f[i,j]=f[i-1,j-1]+j*f[i-1,j]
由于盒子有区分,应乘上盒子数的阶乘
递归+记忆化