«   2022/10   »
            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          
Archives
Today
0
Total
96,326
관리 메뉴

차근차근

[백준 2225] 합분해 본문

대학교/Algorithm

[백준 2225] 합분해

SWKo 2020. 3. 14. 13:15

0. 제목

  • 백준 2225 합분해
  • BOJ 2225 합분해
  • C++ 2225 합분해

1. 문제

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


2. 풀이

  • 0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 문제이다.
  • dp를 이용하였고 dp[K][N]의 의미는 K개의 수로 N을 만드는 경우의 수이다.
  • 예를 들어, dp[3][30]을 구한다고 해보자.
  • 3개로 30을 만들어야 하는 경우이고, 마지막에 더하는 수가 0이라면 2개로 30을 만드는 경우가 나올테고, 마지막에 더하는 수가 1이라면 2개로 29를 만드는 경우가 나올테고, 마지막에 더하는 수가 2라면 2개로 28을 만드는 경우가 나올테다.
  • 위와 같이 쭉 나열해보면 다음과 같은 점화식이 나온다.
  • dp[i][j] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2] + ... + dp[i-1][j-1] + dp[i-1][j]
  • 코드로 그대로 구현하고 구현 도중 1000000000 으로 나눈 나머지를 구하는 것에 유의하면 된다.

3. 코드

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
#include <iostream>
using namespace std;
 
int main(int argc, const char * argv[]) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);
    int N, K;
    int dp[201][201= {0};//dp[K][N] => K개로 N만들기
    
    cin >> N >> K;
    
    for(int i = 0; i <= N; i++){
        dp[1][i] = 1;
        dp[2][i] = i + 1;
    }
    
    for(int i = 3; i <= K; i++){
        for(int j = 0; j <= N; j++){
            for(int k = 0; k <= j; k++){
                dp[i][j] = (dp[i][j] + dp[i-1][j-k]) % 1000000000;
            }
        }
    }
    cout << dp[K][N] << '\n';
    
    return 0;
}
 
 

'대학교 > Algorithm' 카테고리의 다른 글

[백준 10819] 차이를 최대로  (0) 2020.03.18
[백준 6378] 디지털 루트  (0) 2020.03.15
[백준 9461] 파도반 수열  (0) 2020.03.13
[백준 1167] 트리의 지름  (0) 2020.03.11
[백준 11725] 트리의 부모 찾기  (0) 2020.03.11
0 Comments
댓글쓰기 폼