본문 바로가기

개발/알고리즘

합분해

문제


0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 프로그램을 작성하시오.


덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 또한 한 개의 수를 여러 번 쓸 수도 있다.




입력


첫 번째 줄에 두 정수 N, K가 공백으로 분리되어 주어진다. (1 ≤ N, K ≤ 200)




출력


첫 번째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.




힌트


예제 입력


20 2


예제 출력


21




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <fstream>
using namespace std;
//D[i][j] = i개의 수를 더해서 j를 만드는 경우의 수
//D[i][j] = sum of D[i-1][j-k] for all 0<=k<=j
//D[i-1][j-k] 마지막에 더한 수가 k인 경우의 수
  
//D[3][5] = 0:0:5, 0:1:4, 0:2:3,...,0:5:0 = D[2][5]
//D[3][5] = 1:0:4, 1:1:3, 1:2:2,...,1:4:0 = D[2][4]
//...
//D[3][5] = 5:0:0 = D[2][0]
  
//D[2][5] + D[2][4] + D[2][3] + D[2][2] + D[2][1] + D[2][0]
//D[2][5] = 0:5, 1:4, 2:3, 3:2, 4:1, 5:0 -> 6개
//D[2][4] = 0:4, 1:3, 2:2, 3:1, 4:0 -> 5개
//D[2][3] = 0:3, 1:2, 2:1, 3:0 -> 4개
//D[2][2] = 0:2, 1:1, 2:0 -> 3개
//D[2][1] = 0:1, 1:0 -> 2개
//D[2][0] = 0:0 -> 1개
  
int N, K;
long long D[201][201];
int main() {
    //ifstream cin("input.txt");
    cin >> N >> K;
    D[0][0] = 1;
    for (int i = 1; i <= K; i++) {
        for (int j = 0; j <= N; j++) {
            for (int k = 0; k <= j; k++) {
                D[i][j] += D[i - 1][j - k];
                D[i][j] %= 1000000000;
            }
        }
    }
    cout << D[K][N] << endl;
    //system("pause");
    return 0;
}


'개발 > 알고리즘' 카테고리의 다른 글

마트료시카  (0) 2016.12.09
폐지줍기  (0) 2016.12.09
롤러코스터  (0) 2016.12.09
인접한 비트의 개수  (0) 2016.12.09
이친수  (0) 2016.12.09