PS/BOJ
[PS][DP] 14916 : 거스름돈
오리버거
2021. 8. 8. 17:16
[2021년 08월 08일 17시 04분 작성]
[PS][DP]
14916 : 거스름돈
[문제 링크 : (클릭)]
1. 풀이
기초적인 DP 문제입니다.
점화식을 아래와 같이 세우고, 코드로 옮겨주면 해결할 수 있습니다.
DP(k) = INF (k<=0) 1 (k==2 or k==5) min(DP(k-2), DP(k-5)) + 1; (else) |
+) 하나 유의해야 할 점은 있습니다. 바로, 주어진 2원 5원 동전으로 거슬러줄 수 없는 경우가 있습니다.
이럴 떄에는 DP(k) 값이 INF를 넘어서기 때문에 이를 조건문으로 잘 걸러주어야 합니다.
2. 소스코드
[Github 링크 : (클릭)]
#include <bits/stdc++.h>
using namespace std;
const int INF = 2147000000;
int n, cache[100001];
int GetAnswer(int k)
{
int &ret = cache[k];
if(ret != -1) return ret;
if(k==0 || k==2 || k==5) return ret = (k ? 1 : 0);
ret = INF;
if(k-2 >= 0) ret = GetAnswer(k-2) + 1;
if(k-5 >= 5) ret = min(ret, GetAnswer(k-5) + 1);
return ret;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin>>n;
memset(cache, -1, sizeof(cache));
int ans = GetAnswer(n);
cout<<(ans >= INF ? -1 : ans)<<'\n';
return 0;
}