放蘋果

題目描述

把 M 個一樣的蘋果放在 N 個一樣的盤子裏,容許有的盤子空着不放,問共有多少種不一樣的分法?
注意:五、一、1 和 一、五、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
相關文章
相關標籤/搜索