합분해 성공 풀이

시간 제한
메모리 제한
제출
정답
맞은 사람
정답 비율
2 초
128 MB
5062
2171
1634
42.630%

문제
0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 프로그램을 작성하시오.
덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 또한 한 개의 수를 여러 번 쓸 수도 있다.
입력
첫째 줄에 두 정수 N(1≤N≤200), K(1≤K≤200)가 주어진다.
출력
첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.
예제 입력 
20 2
예제 출력 
21





































합분해 문제

문제에서 어려웠던 점 

  • 어떻게 풀어야 하는지 전혀 파악이 안되었다. 

푸는 Logic

N이라는 숫자를 만들기 위해서 K개수의 숫자가 필요하다 

O + O + O .... + O = N

여기서 맨 마지막 수를 L 이라고 한다면 

O + O + O .... + O = N

d[k-1][n-L]     +  L

점화식은 이렇게 된다. 

L의 범위가 다음 topic 인데 

L은 N과 같을 때 가장 크고 0일 때 가장 작다. 

#include <iostream>

using namespace std;

int d[201][201];

int main(void)
{
    int n, k;
    cin >> n >> k;
    d[0][0] = 1;
    for (int i = 1; i <= k; ++i) {
        for (int j = 0; j <= n; ++j) {
            for (int l = 0; l <= j; ++l) {
                d[i][j] += d[i - 1][j - l];
                d[i][j] %= 1000000000;
            }
        }
    }
    cout << d[k][n];
    return 0;
}


















'알고리즘' 카테고리의 다른 글

[DP] 백준 9507 Generations of Tribbles  (0) 2018.04.29
[DP] 백준 1309 동물원  (0) 2018.04.29
[DP] 백준 1965 상자넣기  (0) 2018.04.29
[DP] 백준 9084 동전  (0) 2018.04.29
[EAZY] 백준 15624 피보나치 7  (0) 2018.04.02

+ Recent posts