Algorithm

[BOJ] 2293번 : 동전 1

rudgh99_algo 2024. 9. 30. 17:30

1. problem : 

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

 

 

2. solution 1 :

#include <bits/stdc++.h>
using namespace std;
int n, k; 
int a[105];
int d[10005]; 

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin >> n >> k; 
	for (int i = 0; i < n; i++) cin >> a[i]; 
	d[0] = 1; 
	for (int i = 0; i < n; i++) {
		for (int j = a[i]; j <= k; j++) {
			d[j] += d[j - a[i]];
		}
	}
	cout << d[k] << '\n';
}

source code 출처 : https://github.com/encrypted-def/basic-algo-lecture/blob/master/0x10/solutions/2293.cpp

 

basic-algo-lecture/0x10/solutions/2293.cpp at master · encrypted-def/basic-algo-lecture

바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.

github.com

 

dp를 이용해서 풀었다. 따라서, 세 가지 스텝을 따른다. 

1. 테이블을 정의한다. d [i] = i라는 금액을 만드는 경우의 수 

2. 점화식을 작성한다. d [i] = d [j-a [i]] 

3. 초기값을 설정한다. d [0] = 1 

1,2,5 
d[0] = 0 --> 1
d[1] = 1 -->1
d[2] = 11, 2 -->2
d[3] = 111, 21, -->2
d[4] = 1111, 211, 22  -->3
d[5] = 11111, 2111,221,5  -->4
d[6] = 111111,21111,2211,51,222 --> 5 
d[7] = 1111111,211111,22111,511,2221,52 -->6 
d[8] = 11111111,2111111,221111,5111,22211,521,2222 --> 7 
d[9] = 111111111,21111111,2211111,51111,222111,5211,22221,522 --> 8 
d[10] = 1111111111,211111111,22111111,511111,2221111,52111,222211,5221,22222,55 -->10

콘셉트가 아직 완전히 이해가 가지는 않는다. 하지만, 이해가 가는 것 같기도 하다. 시간이 약이다.