728x90

문제

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

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

입력

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

출력

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


약간은 까다로운 문제이다. 

합분해에서 0또한 합으로 할 수 있다는 점을 주의하면 된다. 

dp[N][K]를 K개 더해서 N을 표현하는 가지수라고 하면

dp[N][K] = dp[N-1][K] + dp[N][K-1]라고 할 수 있다. 

N-1을 K개로 표현한 것에 1씩을 더해주는 방법과

N을 K-1개로 표현한 것에 0을 더하는 방법, 총 두가지를 생각해면 된다.

 

즉 N=2, K=2일때 

dp[1][2] = (1,0), (0,1)이 있는데 이 앞에 1씩만 더해보면  (2,0), (1, 1)로 두가지가 나오고

dp[2][1] = (2)에서 0을 더하면 (0,2)가 된다.

즉 총 세 경우가 나온다.

 

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/2020/%ED%95%A9%EB%B6%84%ED%95%B4%20(2225%EB%B2%88).cpp

 

chosh95/STUDY

프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com

 

C++ 코드

#include <iostream>
using namespace std;
int N, K;
long long dp[210][210];

int main()
{
	cin >> N >> K;
	for (int i = 1; i <= 200; i++)
		dp[i][1] = 1;
	for (int i = 1; i <= 200; i++)
		dp[1][i] = i;

	for (int i = 2; i <= N; i++) {
		for (int j = 2; j <= K; j++) {
			dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % 1000000000;
		}
	}
	cout << dp[N][K];
}
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 괄호 (9012번)  (0) 2020.02.25
[백준] 카드 구매하기 (11052번)  (0) 2020.02.23
[백준] 파도반 수열 (9461번)  (0) 2020.02.23
[백준] 타일 채우기 (2133번)  (0) 2020.02.23
[백준] 제곱수의 합 (1699번)  (0) 2020.02.23

+ Recent posts