题目描述
把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
注意:5、1、1 和 1、5、1 是同一种分法,即顺序无关。
注意:5、1、1 和 1、5、1 是同一种分法,即顺序无关。
输入描述:
输入包含多组数据。
每组数据包含两个正整数 m和n(1≤m, n≤20)。
输出描述:
对应每组数据,输出一个整数k,表示有k种不同的分法。
示例1
输出
复制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