2225번: 합분해
첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 프로그램을 작성하시오.
덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 또한 한 개의 수를 여러 번 쓸 수도 있다.
[이해하기]
N / K | 1 | 2 | 3 | 4 |
1 | 1 | 2 | 3 | 4 |
2 | 1 | 3 | 6 | |
3 | 1 | 4 | ||
4 | 1 |
K=1인 경우: 1가지씩
N=1, K=2인 경우: 0, 1 => 2가지
N=1, K=3인 경우: 0, 0, 1 => 3가지
N=1, K=4인 경우: 0, 0, 0, 4 => 4가지
N=2, K=2인 경우: 0, 2 / 1, 1 => 3가지
N=2, K=3인 경우: 0, 0, 2 / 0, 1, 1 => 6가지
N=3, K=2인 경우: 0, 3 / 1, 2 => 4가지
여기까지 하니까 규칙이 보인다!
점화식으로 나타내면
d[i][j] = d[i-1][j] + d[i][j-1]
[참고]
[C++] 백준 2225 - 합분해 (tistory.com)
[C++] 백준 2225 - 합분해
문제 링크 https://www.acmicpc.net/problem/2225 2225번: 합분해 첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net k가 1인 경우는 n에 상관없이 1가지의 방법밖에 존재하지 않습니다. n이 1
dontdiethere.tistory.com
#include <iostream>
using namespace std;
int main(){
int d[201][201];
int n, k;
cin >> n >> k;
//N=1인 경우 입력
for (int i=0;i<=k;i++)
d[1][i] = i;
//N=2인 경우 입력
for (int i=2;i<=n;i++)
for (int j=1;j<=k;j++)
d[i][j] = (d[i-1][j] + d[i][j-1]) % 1000000000;
cout << d[n][k] << endl;
return 0;
}
'‡ CODING TEST STUDY ‡ > º 백준' 카테고리의 다른 글
[백준 11724번 C++] 연결 요소의 개수 (0) | 2023.11.09 |
---|---|
[백준 1260번 C++] DFS와 BFS (0) | 2023.11.09 |
[백준 11058번 C++] 크리보드 (0) | 2023.10.20 |
[백준 2156번 C++] 포도주 시식 (0) | 2023.10.15 |
[백준 1932번 C++] 정수 삼각형 (0) | 2023.10.14 |