baekjoon 2294:동전 2
2294번 동전 2
접근
각 동전이 서로 나눠지는 관계가 보장된다면 이 동전 문제는 greedy 문제가 된다.
하지만 그렇지 않은 경우도 있기 때문에 dp로 모든 경우의 수를 직접 해봐야한다.
각 동전을 무제한적으로 쓸 수 있기 때문에 각 동전을 몇개 썼는지 여부는 기록할 필요가 없다.
단지 내가 채워야하는 돈만 dp로 넘겨주면 될 것 같다.
코드
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
32
//2294
#include <iostream>
#include <array>
#include <vector>
using namespace std;
array<int, 10001> cache;
int dp(int k, vector<int>& v);
int m;
int main(){
int n; cin >> n >> m;
vector<int> size(n, 0);
for(int i = 0; i < n; i++){
cin >> size[i];
}
fill(cache.begin(), cache.end(), -1);
cout << dp(m, size);
return 0;
}
int dp(int k, vector<int>& v){
if(k == 0) return 0;
int& ret = cache[k];
if(ret != -1) return ret;
ret = 1e6;
for(int i = 0; i < v.size(); i++){
if(v[i] > k) continue;
ret = min(ret, dp(k - v[i], v) + 1);
}
if(ret == 1e6 && k == m) ret = -1;
return ret;
}
배운 점
기초적인 dp 문제였다.
This post is licensed under CC BY 4.0 by the author.