UVa - 10943 解題紀錄
題目: UVa - 10943 - How do you add?
題目說明
給兩個整數 N
、K
,求將 N
拆為 K
個小於等於 N
的數字相加的所有情況數。不同排序視為不同情況,如 20 + 0,0 + 20 為兩種情況。
題目看不是很懂,好像計算的時候要隨時取 1000000 的餘數。
Input: 每組測資有兩個整數,依序為 N
、K
,若 N
、K
皆為 0 表結束。
Output: 輸出將 N
拆為 K
個小於等於 N
的數字相加的所有情況數。
解題思路
動態規劃題,由於測資範圍不大,因此先算出所有情況的答案再輸出即可。
定義 dp[i][j]
表 i
拆成 j
個數字的方法數,先設定初始狀態,dp[i][1] = 1, 對於所有 0 <= i < 101,因為任何數拆成一個數字相加只會有一個情況,就是自己。
對於 dp[i][j]
:
dp[i][j] = (dp[i][j] + dp[i - k][j - 1]) % 1000000,對於所有 0 <= k <= i。
可以想像為,將 i
拆為 k
及 i - k
相加,而 i - k
由 j - 1
個數字相加組成,這樣組合起來的意義即為使用 j
個數字組合成 i
。
簡單來說,就是不斷枚舉加入最後一位數字,並將所有情況數相加即可。
參考解法
1 |
|
參考資料
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Larry's notes!
評論