코딩 트레이닝
백준 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;
}
- 지금은 많은 유형의 문제를 풀지 않아서 동적계획이 떠올랐지만, 여러 유형을 접했을 때도 생각해낼 수 있도록 더 많이 풀어봐야겠다.