일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- C/C++
- 라인
- 파이썬
- binary search
- 백준
- 모두를 위한 딥러닝
- leetcode
- spring
- 시애틀
- 딥러닝
- 알고리즘
- jvm
- 벤쿠버
- 스타벅스
- BFS
- dfs
- 스프링 프레임워크
- 백트래킹
- STL
- 프로그래머스
- 머신러닝
- DP
- 프로그래밍언어론
- 다이나믹프로그래밍
- Spring Framework
- Java
- 릿코드
- Python
- 라인플러스
- C++
- Today
- Total
케이스윔의 개발 블로그
[백준][DP] 2225번 합분해 본문
문제
0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 프로그램을 작성하시오. 덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 또한 한 개의 수를 여러 번 쓸 수도 있다.
문제 출처: 백준 온라인 저지(https://www.acmicpc.net/problem/2225)
풀이
문제를 읽어보았을 때 꽤 간단한 문제라고 느껴서 바로 점화식을 세웠지만 조건을 하나 놓쳐서 다시 읽어본 문제입니다. 식은 간단히 세울 수 있었습니다 dp[N][K]를 K개의 정수를 더해서 N을 만드는 것이라고 정의를 합니다. 그렇게 되면 dp[N][K] = dp[N-(N또는 보다 작은 정수)][K-1]의 합이 됩니다. 즉 N또는 N보다 작은 숫자를 K-1개로 만들었다면 거기에다가 N을 만들 수 있도록 수를 더해주면 K-1개로 만들 수 있는 수들의 합이 곧 K개의 정수를 더해서 만들 수 있는 경우의 수입니다. 여기서 N 또는이라고 한 이유는 정수 0도 포함되기 때문에 K-1개를 통해서 N을 만들었을 때 해당 수에 0 을 더해주면 K개의 정수를 사용한 것이 되기 때문에 N도 포함해줘야합니다! 제가 처음에 놓쳤던 조건이 0을 포함하지 않아서 예제 입력 20 2를 입력했을 때 19가 나와서 다시 조건을 읽어보고 고쳤습니다. 또 문제를 통해 얻을 수 있는 힌트는 1,000,000,000 으로 나눈 나머지를 출력하라고 하니 값이 매우 커질 수 있다는 걸 알 수 있고 dp 배열을 long long으로 선언해야겠다고 떠올릴 수 있습니다.
코드
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[백준][DP] 2167번 2차원 배열의 합 (0) | 2019.01.12 |
---|---|
[백준][DP] 1912번 연속합 (0) | 2018.12.14 |
[백준][DP] 1010번 다리놓기 (0) | 2018.12.05 |
[백준][DP] 11053번 가장 긴 증가하는 부분 수열 (0) | 2018.12.04 |
[백준][DP] 1890번 점프 (0) | 2018.11.18 |