Problem : 합분해
유형 : DP
문제 설명
0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 프로그램을 작성하시오.
덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 또한 한 개의 수를 여러 번 쓸 수도 있다.
예제 입력
첫째 줄에 두 정수 N(1 ≤ N ≤ 200), K(1 ≤ K ≤ 200)가 주어진다.
1 |
|
예제 출력
첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.
1 |
|
해결 전략
D[N][K]
= 정수 K개를 더해 합 N을 만드는 경우의 수
마지막에 더하는 숫자가M
이라고 가정하면 M은 무엇이 될지 모른다. 변수 설정
현재 합N
에서M
을 빼면,N-1
이 되고,
현재K개
에서M
1개 를 빼니,K-1개
가 된다.
D[N][K] += DP[N-M][K-1]
M은 N보다 작거나 같은 경우가 모두 가능하다.
주의할 점
- 0을 여러번 더할 수 있다.
D[0 ~ K][0] = 1
이다.- 예를들어
D[200][0] = 1
: 숫자 0을 0을 200번 더해서 나타 낼 수 있고 - 이런 경우는 단 한번 뿐이다.
- 예를들어
풀이
입력받고, 기본 설정을 해준다.
D[200][0] = 1
을 해준다.
메모제이션을 한다.
- 가능한 모든 M에 대해서, 합을 구한다.
코드
1 |
|
피드백
없음