【简单】算法nodeJs:放苹果

84 阅读1分钟

描述

我们需要将 m 个相同的苹果放入 n 个相同的盘子中,允许有的盘子空着不放。求解有多少种不同的分法。

输入描述:

输入两个整数 m,n(0≦m≦10; 1≦n≦10) 代表苹果数、盘子数。

输出描述:

输出一个整数,代表不同的分法数量。

image.png

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));
    }
})();