티스토리 뷰
동전 0문제인 11074번과 유사한 문제입니다만,
동전의 종류가 가장 작은 동전의 배수가 아닌 경우가 존재합니다.
이 경우에는 Greedy하게 풀 수 없습니다.
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 | #include <cstdio> #include <iostream> using namespace std; int dp[10001], n, k; const int MAX = 987654321; int main() { scanf("%d %d", &n, &k); //모든 방법의 개수를 MAX개로 초기화해줍니다. for (int i = 1; i <= k; i++) { dp[i] = MAX; } for (int i = 0; i < n; i++) { int c; scanf("%d", &c); for (int j = c; j <= k; j++) { if (dp[j] > dp[j - c] + 1) { dp[j] = dp[j - c] + 1; } } } printf("%d", dp[k] == MAX ? -1 : dp[k]); return 0; } | cs |
2293번과 마찬가지로, X원을 만드는 최소의 동전 개수를 A(X)라고 하면, 예제처럼
3 15 1 5 12
라는 Input이 주어질 때, 15원을 만들기 위해 1원, 5원 ,12원짜리 동전을 사용합니다.
A(15) = A(14)+1원, A(10)+5원, A(3)+12원
이고
A(14) = A(13)+1원, A(9)+5원, A(2)+12
A(10) = A(9)+1원, A(5)+5원
A(3) = A(2)+1원
...
의 점화식으로 나타낼 수 있습니다.
최소값만 구하면 되기 때문에,
A(15)를 구할 때는 DP배열을 쭉 한번 돌면서, A(14)+1, A(10)+1, A(3)+1, A(15)의 최소값을
A(15)자리에 대입해주면 됩니다.
소스코드는 위쪽에 써둔것과 같습니다.
'알고리즘 > BOJ' 카테고리의 다른 글
BOJ 11047번, 동전 0 (0) | 2018.10.20 |
---|---|
BOJ 2293번, 동전 1 (0) | 2018.10.20 |
BOJ 14754, Pizza Boxes (0) | 2018.10.20 |
BOJ 1697, 숨바꼭질 (0) | 2018.10.20 |
BOJ 1780, 종이의 개수 (0) | 2018.10.20 |
댓글