알고리즘 문제

[C/C++ 백준 2225번] 합분해 (Gold 5)

새파란 공대생 2020. 5. 21. 14:29

https://www.acmicpc.net/problem/2225

 

2225번: 합분해

첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

문제의 조건에서 '덧셈의 순서가 바뀐 것은 다른 것으로 한다' 라는 조건이 있어, 풀기 어렵진 않은 문제였던 것 같다.

dp[N][K]의 배열을 합이 N, 개수가 K개인 합분해의 경우의 수로 하고, 첫번째 수가 0, 1, 2, ... N일 경우를 생각해서 점화식을 세워보자. 

 dp[i][j]에서 i, j가 0일 때와 j가 1일때 dp[i][j]가 몇일지 초기조건만 세워주면, 그 이후는 쉽다.

 

#include <cstdio>
int main(void){
	int N, K;
	int dp[201][201]={};//dp[N][K] 합, 개수 
	scanf("%d %d",&N, &K);
	for(int i=0; i<=N; i++){
		for(int j=0; j<=K; j++){
			if(j==0)	dp[i][j]=0;
			else if(j==1)	dp[i][j]=1;
			else if(i==0)	dp[i][j]=1;
			else{
				for(int k=0; k<=N; k++){
					if(i-k>=0)
					{
						dp[i][j] += dp[i-k][j-1]; // 점화식
						dp[i][j] = dp[i][j]%1000000000;	
					}
				}
			}
		}
	}
	printf("%d",dp[N][K]);
}