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)가 된다.
즉 총 세 경우가 나온다.
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 |