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!
 評論
