首页 > 试题广场 >

放苹果

[编程题]放苹果
  • 热度指数:12131 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

输入描述:
每行均包含二个整数M和N,以空格分开。1<=M,N<=10。


输出描述:
对输入的每组数据M和N,用一行输出相应的K。
示例1

输入

7 3

输出

8
def distribute_apples(M, N):
    """
    将M个苹果分配到N个盘子的分法数,修正了M < N的情况
    """
    # 创建一个二维列表,用于存储中间结果,以减少重复计算
    dp = [[-1 for _ in range(N + 1)] for _ in range(M + 1)]

    def helper(M, N):
        # 边界条件处理
        if M < 0:
            return 0
        if M == 0&nbs***bsp;N == 1:
            return 1
        if M < N:
            return helper(M, M)  # 当苹果数少于盘子数时,直接使用苹果数作为盘子数进行计算

        # 如果这个结果已经计算过了,直接返回
        if dp[M][N] != -1:
            return dp[M][N]

        # 递归计算
        dp[M][N] = helper(M, N - 1) + helper(M - N, N)
        return dp[M][N]

    return helper(M, N)


M, N = map(int, input().split())
print(distribute_apples(M, N)) 

发表于 2024-03-10 12:20:00 回复(0)