HJ61 放苹果
描述
把 m 个同样的苹果放在 n 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
注意:如果有 7 个苹果和 3 个盘子,(5,1,1)和(1,5,1)被视为是同一种分法。
数据范围:0≤m≤10 0≤m≤10 ,1≤n≤10 1≤n≤10 。
输入描述:
输入两个 int 整数
输出描述:
输出结果,int 型
示例 1
输入:
7 3
输出:
8
题解
动态规划
- 数组含义
dp[i][j] 即为 i 个苹果放入 j 个盘子中的分法种数 - 关系式
dp[i][j] = dp[i-j][j] + dp[i][j-1]; - 初始值
dp[0][…] = 1;
苹果数量为0 分法为1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
// 输入 m n
int m = sc.nextInt();// m个苹果
int n = sc.nextInt();// n个盘子
// dp数组
int [][]dp = new int[m + 1][n + 1];
// 初始值 苹果个数为0 dp[0][...]=1
for (int i = 0; i <= n; i++) {
dp[0][i] = 1;
}
// dp[i][j]=dpp[i-j][j]+dp[i][j-1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (i < j) {
dp[i][j] = dp[i][j - 1];
} else {
dp[i][j] = dp[i][j - 1] + dp[i - j][j];
}
}
}
System.out.println(dp[m][n]);
}
}
}
递归
递归情况:
苹果数目大于等于盘子数目
m >= n getRes(m,n) = getRes(m,n-1)+getRes(m-n,n);
苹果数目小于等于盘子数目
m < n getRes(m,n) = getRes(m,n-1);
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
// m 个 苹果
int m = sc.nextInt();
// n 个 盘子
int n = sc.nextInt();
int res = getRes(m, n);
System.out.println(res);
}
}
public static int getRes(int m, int n) {
if (m == 0 || n == 1) {
return 1;
}
if (m >= n) {
return getRes(m - n, n) + getRes(m, n - 1);
} else {
return getRes(m, n - 1);
}
}
}