코딩 트레이닝

백준 2225번 - 합분해(C언어)

Bum_2 2023. 7. 13. 22:48

문제

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

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

입력

첫째 줄에 두 정수 N(1 ≤ N ≤ 200), K(1 ≤ K ≤ 200)가 주어진다.

출력

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

예제 입력 1

20 2

예제 출력 1

21

예제 입력 2

6 4

예제 출력 2

84

문제 풀이


#include <stdio.h>

#define MOD 1000000000

int dp[201][201]; // dp[i][j]: j개의 수를 사용하여 합이 i가 되는 경우의 수

int main() {
    int N, K;
    scanf("%d %d", &N, &K);

    // 초기 조건 설정
    for (int i = 0; i <= N; i++) {
        dp[i][1] = 1; // 한 개의 수로 i를 만드는 경우의 수는 항상 1개
    }

    // DP 계산
    for (int i = 0; i <= N; i++) {
        for (int j = 2; j <= K; j++) {
            for (int k = 0; k <= i; k++) {
                dp[i][j] += dp[k][j - 1];
                dp[i][j] %= MOD;
            }
        }
    }

    int result = dp[N][K];
    printf("%d\n", result);

    return 0;
}
  • 지금은 많은 유형의 문제를 풀지 않아서 동적계획이 떠올랐지만, 여러 유형을 접했을 때도 생각해낼 수 있도록 더 많이 풀어봐야겠다.