這就是我想出了:
def onesAndTwos(num):
if num <= 0:
return set()
elif num == 1:
return set([(1, 0)])
elif num == 2:
return set([(2,0), (0, 1)])
else:
setA = set([(1 + x[0], x[1]) for x in onesAndTwos(num-1)])
setB = set([(x[0], 1 + x[1]) for x in onesAndTwos(num-2)])
setA.update(setB);
return setA
print onesAndTwos(10)
print len(onesAndTwos(10))
它使用一個元組的第一個元素是一的數量和三三兩兩的第二數目。所以可以用set[(3,0), (1,1)]
來產生3的總和。要查找有多少種組合,您可以統計集合中的元組。 10輸出:
set([(8, 1), (6, 2), (0, 5), (4, 3), (10, 0), (2, 4)])
6
這是一個有點動態規劃方法,我們有一組重複的子問題和相似的結構貫穿始終,使我們能夠建立在以前的解決方案。這不是最優的,因爲你不會重複使用兩個分支中的先前計算的值(第一次拿走1,第二次拿走2),所以我認爲這是一個天真的解決方案。
如果這是一個在線編碼競賽,如何讓別人來解決這個問題將展示您的編碼能力?對不起,這裏沒有幫助。 – Mogsdad
這裏有一個提示:要得到'n'的總和,你可以選擇一個'1'並得到'n-1'的總和,或者選擇一個'2'並得到'n-2'的總和。這種遞歸是否會讓你想起任何事情? – rici
另一個提示:計算'n = 1'到'n = 6'的值。注意任何可疑的東西? – DSM