切換
舊版
前往
大廳
主題

ZeroJudge - a144: 整數分拆 解題心得

Not In My Back Yard | 2018-10-15 12:07:07 | 巴幣 0 | 人氣 1436

題目連結:


題目大意:
給定一正整數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的組合了。



以上,我們可以看到遞迴條件非常地簡單,只要把當前的總和、當前的數組、左邊的數字存起來去遞迴。在途中判斷現在放下去的數字有無超過左邊的數字,有就別放,然後遞減。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作