[문제 위치]
https://www.acmicpc.net/problem/2225
[문제 풀이]
점화식을 바탕으로 해서 다이나믹 프로그래밍을 하는 문제이다.
일단 문제를 작게 쪼개야 한다. 이 문제도 다른 DP 문제와 비슷하다.
N개의 숫자를 사용하여 K를 만들어야 한다.
이는 N-1개의 숫자를 사용하여 K-x(x는 임의의 정수)를 만들고 x를 더해주는 것과 같다.
따라서 N-1개의 숫자로 만들 수 있는 K-x의 경우의 수를 모두 더하면 이것이 N-1개의 숫자로 K개의 숫자를 만들 수 있는 경우의 수가 되는 것이다.
이를 점화식으로 표현하면 다음과 같다.
이를 바탕으로 가장 작은 수에서 점점 올라가며 다이나믹 프로그래밍 구조를 채워나간 다음 dp[N][K]를 호출하면 N개의 숫자로 K를 만드는 경우의 수를 알 수 있다.
아래는 이를 코드로 작성한 것이다.
#include <iostream>
#include <vector>
#define MOD 1000000000
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
// DP 테이블 초기화
int dp[201][201] = { 0 };
int main() {
fastio;
int n, k;
cin >> n >> k;
// 초기값 설정: dp[0][0] = 1
dp[0][0] = 1;
// DP 배열 채우기
for (int i = 1; i <= k; i++) {
for (int j = 0; j <= n; j++) {
for (int x = 0; x <= j; x++) {
dp[i][j] = (dp[i][j] + dp[i - 1][j - x]) % MOD;
}
}
}
// 결과 출력
cout << dp[k][n] << endl;
return 0;
}
'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글
[Gold V] 트리 - 1068 (0) | 2024.06.20 |
---|---|
[Gold V] 두 용액 - 2470 (0) | 2024.06.19 |
[Gold V] 동전 2 - 2294 (0) | 2024.06.18 |
[Gold V] 숨바꼭질 3 - 13549 (0) | 2024.06.13 |
[Gold V] 리모콘 - 1107 (0) | 2024.06.11 |