放苹果

题目描述

把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
注意:5、1、1 和 1、5、1 是同一种分法,即顺序无关。

输入描述:

输入包含多组数据。

每组数据包含两个正整数 m和n(1≤m, n≤20)。

输出描述:

对应每组数据,输出一个整数k,表示有k种不同的分法。
示例1

输入

复制
7 3

输出

复制
8

思路:
首先定义状态:results[i][j]: 表示将i个苹果放置到j个盘子上面。
状态转移方程为:
  如果i>=j:苹果数目大于或者等于盘子的数目,那么当前状态等于=其中只有一个盘子为空的状态+所有盘子都有苹果的状态
results[i][j] = results[i][j-1] + results[i-j][j]
如果i<j:
results[i][j] = results[i][i]
代码实现由递归和非递归方式:
def getCount(m,n):
    if m == 0 or n == 1:
        return 1
    if m < n:
        return getCount(m,m)
    else:
        return getCount(m,n-1) + getCount(m-n,n)

while True:
    try:
        m, n = raw_input().split(' ')
        print getCount(int(m),int(n))
    except:
        break
results = [[1 for i in xrange(21)] for j in xrange(21)]

for i in xrange(1,21):
    for j in xrange(2, 21):
        if i < j:
            results[i][j] = results[i][i]
        else:
            results[i][j] = results[i-j][j] + results[i][j-1]

while True:
    try:
        m, n = map(int, raw_input().split(' '))
        print results[m][n]
    except:
        break
原文地址:https://www.cnblogs.com/Spider-spiders/p/10636593.html