首页 > 试题广场 >

放苹果

[编程题]放苹果
  • 热度指数: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
while True:
    try:
        m,n = list(map(int,input().split()))
        dp = [[0 for i in range(n+1)] for j in range(m+1)] #dp[i][j]表示j个盘子装i个苹果
        for i in range(1,m+1):
            dp[i][1] = 1
            for j in range(2,n+1):
                if i < j:                    #盘子比苹果多并不会增加分法
                    dp[i][j] = dp[i][j-1]
                elif i == j:                 #盘子和苹果一样多,相当于多了一个全部盘子只摆一个,其他摆法起码有一个空盘
                    dp[i][j] = dp[i][j-1] + 1
                else:                        #盒子比苹果少,等于有一个空盘加上全部盘摆上一个苹果剩余的摆法
                    dp[i][j] = dp[i-j][j] + dp[i][j-1]
        print(dp[m][n])
    except Exception:
        break
编辑于 2018-10-08 18:29:26 回复(0)

python DP  7行解法:

for _ in range(int(input())):
    a, b = map(int, input().split())
    dp = [[1 for i in range(b + 1)] for j in range(a + 1)]
    for i in range(1, a + 1):
        for j in range(2, b + 1):
            dp[i][j] = (dp[i][j - 1] + dp[i - j][j]) if i >= j else dp[i][j - 1]
    print(dp[-1][-1])
编辑于 2017-10-23 15:29:15 回复(0)