# 題目: UVa 10943 - How do you add
# 題目說明
你需要解決一個計算的問題
給一個最大數 N ,由小於 N 的數中取 K 個數加至 N ,求有幾種加法?
INPUT:
每筆測資輸入兩個整數 N 、 K
當 N 與 K 為 0 時結束程式
OUTPUT:
輸出最大數 N 時,每次取 K 個數有幾種加法?( dp[N][K] )
# 解題方法
同樣將所有情況的答案算出儲存,再根據 N, K 的值輸出答案
當 K = 1 時,只有一種可能,所以將 dp[i][1] 設為 1
利用 2 層 for 迴圈動態規劃,對於 dp[i][j] 來說,為 dp[i - k][j - 1] 的總和 (k 為 0 ~ i)
dp[i][j] 記得要 &= 1000000
# 參考程式碼
#include <iostream> | |
using namespace std; | |
int N, K; | |
int dp[101][101]; | |
int main() | |
{ | |
ios::sync_with_stdio(false); | |
cin.tie(nullptr); | |
cout.tie(nullptr); | |
for (int i = 0; i < 101; ++i) dp[i][1] = 1; | |
for (int i = 0; i < 101; ++i) for (int j = 1; j < 101; ++j) | |
for (int k = 0; k <= i; ++k) dp[i][j] = (dp[i][j] + dp[i - k][j - 1]) % 1000000; | |
while (cin >> N >> K, N && K) cout << dp[N][K] << "\n"; | |
return 0; | |
} |
# 參考資料
https://www.larrysprognotes.com/UVa-10943/