題目連結:
給定一正整數 m (m ≦ 5),代表有 m 筆測試資料,每筆佔一列輸入。每列輸入給定三正整數 y 、 i 、 z (1 ≦ y ≦ 500 , 1 ≦ i ≦ 50 , 1 ≦ z ≦ 100),分別代表欲分解的數、分解出來的個數,以及數值最大的部分的數字上界。
即 y = a1 + a2 + …… + ai , 且 z ≧ a1 ≧ a2 ≧ …… ≧ ai ≧ 1 。求有多少組 a1 、 a2 、 …… 、 ai ?
5
20 4 7
100 50 51
487 18 87
492 19 89
500 19 90
13
204226
7139824136004762
20430740394679891
25985433353057732
定義一個二維陣列 Di, j , i 代表要分解的數字、j 代表分解出來的和之個數,而 Di, j 本身代表 i 分解為 j 個數字的和的方法數。
而從拉瑪努金那一題(上面連結到的題目)當中的 DP 式(不是遞迴式,因為不是由上往下(Top-Down)的求解(此為一般遞迴))稍作改動變為:
初始: D0, 0 = 1
for a = 1 → z :
for b = i → y :
for c = 1 → i :
Db, c = Db, c + Db-a, c-1
也就是我們將分解的部分之「開頭」限制在 z 以下(含),並記錄每種分解長度的方法數。最後推得的 Dy, i 即是所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。