코딩고치

[백준][DP] 합분해 본문

백준 알고리즘 기초/다이내믹 프로그래밍

[백준][DP] 합분해

코딩고치 2019. 11. 20. 05:41

1. 문제 주소

https://www.acmicpc.net/problem/2225

 

2225번: 합분해

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

www.acmicpc.net

2. 문제

0부터 N까지의 정수를 K개 더하여 N이 나오는 경우의 수를 구하는 문제이다.

[K][N]인 경우에 다음과 같은 식이 된다.

$$x_{1}+x_{2}+x_{3}+...+x_{K}=N$$

이것을 다시 써보면

$$x_{1}+x_{2}+x_{3}+...+x_{K-1}+X = N$$

로 나타낼 수 있으며 이 식은 [K-1][N-X] (X <=N)이 된다. 즉

$$[K][N]=\Sigma [K-1][N-X]$$

가 된다. 이 관계식을 이용하여 코드를 작성하면 풀 수 있다.

3. 소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
long long dp[201][201];
long long divide = 1000000000;
 
int main() {
    int n;
    int k;
    cin >> n >> k;
 
    dp[0][0= 1LL;
    for (int i = 1; i <= k; i++) {
        for (int j = 0; j <= n; j++) {
            for (int m = 0; m <= j; m++) {
                dp[i][j] += dp[i - 1][j - m];
                dp[i][j] %= divide;
            }
        }
    }
    cout << dp[k][n] << '\n';
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 
Comments