題目連結:
題目大意:
給定一正整數N(N < 100)。而一正整數可以分為好幾個正整數之和,並定義一正整數的整數分割(Partition)為以下:
a1 + a2 + ……ak=N,其中K為一正整數。
a1 ≧ a2 ≧ …… ≧ ak。
分割函數P(N),為符合以上兩個條件的數組之數目。
現在求符合P(N)的數組,並按照字典序由大到小輸出。
範例輸入:
4
範例輸出:
4
3 1
2 2
2 1 1
1 1 1 1
解題思維:
以下舉N = 5作為例子:
一開始,5本身就是一組答案。
接下來從4開始,在4右邊的數字之總和不超過1,所以只有4 1這種組合。
再來是從3開始,一樣,在3右邊的所有數字總和不能超過2,所以我們有了3 2這個數組,接下來第二位從1開始,在其右邊的總和不超過1,所以有3 1 1數組。
再接下來是2開頭,右邊總和不超過3,但是我們發現直接放一個3的話,會不符合P(N)的條件,所以第二位要從2開始放。因此有2 2 1組合。相似地,我們可以求出2 1 1 1的組合。
最後開頭為1,便是全部為1的組合了。
以上,我們可以看到遞迴條件非常地簡單,只要把當前的總和、當前的數組、左邊的數字存起來去遞迴。在途中判斷現在放下去的數字有無超過左邊的數字,有就別放,然後遞減。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。