描述
我们需要将 m 个相同的苹果放入 n 个相同的盘子中,允许有的盘子空着不放。求解有多少种不同的分法。
输入描述:
输入两个整数 m,n(0≦m≦10; 1≦n≦10) 代表苹果数、盘子数。
输出描述:
输出一个整数,代表不同的分法数量。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
function countWays(m, n) {
// 创建一个二维数组来存储中间结果
let dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
// 初始化边界条件
for (let i = 0; i <= m; i++) {
dp[i][1] = 1; // 只有一个盘子时,只有一种方法
}
for (let j = 2; j <= n; j++) {
dp[0][j] = 1; // 如果苹果数为0,只有一种方法(所有盘子都为空)
}
// 动态规划填表
for (let i = 1; i <= m; i++) {
for (let j = 2; j <= n; j++) {
dp[i][j] = dp[i][j - 1];
if (i >= j) {
dp[i][j] += dp[i - j][j];
}
}
}
return dp[m][n];
}
while ((line = await readline())) {
let tokens = line.split(" ");
let a = parseInt(tokens[0]);
let b = parseInt(tokens[1]);
console.log(countWays(a, b));
}
})();