반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 2225 합분해 본문

백준(Baekjoon) 문제

백준 2225 합분해

huiung 2020. 1. 29. 17:27
반응형

 

0~N까지의 수를 K번 이용하여 N을 만드는 경우를 출력하는 문제입니다.

 

N,K가 모두 <= 200 이므로 dp를 이용하여 해결하면 됩니다.

 

저는 dp[i][j] --> j개의 숫자를 써서 i를 만드는 경우로 정의를 하였습니다.

 

숫자의 중복이 가능하므로 각 함수마다 0~N까지 숫자를 다돌려봐야 하므로 시간복잡도는

O(N^2*K) 정도가 되겠습니다.

 

아래는 코드입니다. 

 

 

#include <iostream>
#include <cstring>

#define MOD 1000000000
using namespace std;

long long dp[220][220];
int N, K;

long long sol(int k, int sum) {
	
	if (sum > N) return 0;
	if (K == k) {
		if (sum == N) return 1;
		else return 0;
	}

	long long &ret = dp[sum][k];
	if (ret != -1) return ret;
	ret = 0;

	for (int i = 0; i <= N; i++) {
		ret += sol(k + 1, sum + i);
		ret %= MOD;
	}

	return ret;
}

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	memset(dp, -1, sizeof(dp));
	
	cin >> N >> K;
	
	cout<<sol(0, 0);

	return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 1708 볼록 껍질  (0) 2020.02.13
백준 1613 역사  (0) 2020.01.29
백준 1275 커피숍2  (0) 2020.01.22
백준 2243 사탕상자  (0) 2020.01.22
백준 5569 출근 경로  (0) 2020.01.21