題目連結:
題目大意:
有多列的輸入。每列輸入有一正整數 N ( N ≦ 200 ),求 N 的
整數分拆之方法數。
0
1
200
以下三行程式碼可以求出任意 N 的整數分拆方法數(N ≦ 200):
(其中 answer[0] 一開始為 0 ,answer[1] ~ answer[200] 一開始都設為 0 )
for (int i = 1; i <= 200; i++)
for (int j = i; j <= 200; j++)
answers[j] += answers[j - i];
以下圖示可以稍微表示以上程式碼的運行模式(不過下圖左上角的i、j要交換):
由上可以看到,第一次(迴圈外層的 i 值,也就是 i = 1 時)是在為每個數字找 1 開頭的拆分方法; 外迴圈的i = 2 時,內迴圈則是找 2 開頭的方法……以此類推。
而我們可以看到 i = 2 時,answer[5] 的方法數要加上 answer[3] 的方法數。這是因為我們要找開頭是 2 的方法,也就是剩下的結尾數字總和為 5 - 2 = 3,而 3 的方法數在前面已經跟 3 - 2 = 1 的方法處理過了。因此 answer[5] 的方法數要加上 answer[3] 的方法數。
而 i 為任意數字時也是與上同理。
全部可能的 N 值(1 ~ 200)都跑過一次後,接下來就是看輸入什麼數字,就輸出相應的答案即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。