Question: Calculate the split number of a number N into k numbers. It can be repeated and there can be 0.
Analysis: DP, combined mathematics.
Method 1: DP
Status: f (I, j) is the number of methods split into I numbers by J, then f (I, j) = sum (f (I, k )) {0 ≤ k ≤ j };
Method 2: Counting Principle
Partition Method: C (n + k-1, k-1) = (n + 1) (N + 2)... (n + k-1 ),
C (n, m) = C (n-1, m-1) + C (n-1, m) can be used for computing.
Note: callback (callback) callback.
Method 1: DP
# Include <iostream> # include <cstdlib> # include <cstdio> using namespace STD; int f [101] [101]; int main () {for (INT I = 0; I <101; ++ I) for (Int J = 0; j <101; ++ J) f [I] [J] = 0; For (INT I = 0; I <101; ++ I) f [1] [I] = 1; for (INT I = 1; I <101; ++ I) for (Int J = 0; j <101; ++ J) for (int K = 0; k <= J; ++ K) f [I] [J] = (F [I] [J] + F [I-1] [J-K]) % 1000000; int n, m; while (scanf ("% d", & N, & M) & N + M) printf ("% d \ n ", f [m] [N]); Return 0 ;}
Method 2: Counting Principle
# Include <iostream> # include <cstdlib> # include <cstdio> using namespace STD; int C [201] [201]; int main () {for (INT I = 0; I <201; ++ I) for (Int J = 0; j <201; ++ J) C [I] [J] = 0; For (INT I = 0; I <201; ++ I) C [I] [0] = 1; for (INT I = 1; I <201; ++ I) for (Int J = 1; j <= I; ++ J) C [I] [J] = (C [I-1] [J] + C [I-1] [J-1]) % 1000000; int N, m; while (scanf ("% d", & N, & M) & N + M) printf ("% d \ n ", c [n + M-1] m-1]); Return 0 ;}