작심삼일

[백준] 2225번 | 합분해 | C++ 본문

스터디/코테

[백준] 2225번 | 합분해 | C++

yun_s 2021. 12. 15. 16:16
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/2225


문제

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

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


입력

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


출력

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


내 풀이

어떤 수 N은 그보다 하나 작은 수인 N-1에 대한 경우의 수로 구하면 쉽게 구할 수 있다.

이 생각에 기인해 다이나믹 프로그래밍으로 푼다.


코드

#include<iostream>

int N, K;
long long f[201][201];

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

	for (int n = 1; n <= N; n++) {
		f[n][1] = 1;
	}

	for (int k = 1; k <= K; k++) {
		f[1][k] = k;
	}

	for (int n = 2; n <= N; n++) {
		for (int k = 2; k <= K; k++) {
			f[n][k] = (f[n - 1][k] + f[n][k - 1]) % 1000000000;
		}
	}

	printf("%lld", f[N][K]);

	return 0;
}
728x90
반응형
Comments