티스토리 뷰

Algorithm

[백준 2091] 동전

devbelly 2020. 11. 3. 14:47

문제

www.acmicpc.net/problem/2091

 

알고리즘

DP

 

풀이

만들 값과 동전의 갯수가 주어졌을 때, 동전을 최대로 사용하여 해당 값을 만드는 문제입니다.

 

최소동전을 사용하는 것은 동전들의 관계가 canonical 하므로 그리디로 해결가능하나 최대로 사용하기 위해선 다이나믹 프로그래밍을 이용해야합니다.

 

$cache[i]$= i원을 만들 때, 사용하는 최대 동전의 갯수 

 

작은 동전부터 작은 값의 테이블을 채워나가면 됩니다. 특정 값까지 테이블이 채워져 있다면, 당연하게도 동전을 많이 사용하려면 다음 테이블을 갱신할 때 작은 동전부터 사용해야하기 때문입니다. 테이블에 채워져 있는 값을 발견했다면 그 값 이전은 이미 최대로 동전을 사용하기를 마친 상태이고, 값 뒤에만 갱신해나가면 됩니다.

 

코드

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; ++i)
#define REP(i, n) for (int i = 1; i <= n; ++i)
using namespace std;

int coin[4] = { 1, 5, 10, 25 };

int cache[10001], par[10001], used[26], cnt[4], x;

bool get_max(int& a, int b) {
    a = max(a, b);
    return a == b;
}
int main() {
#ifndef ONLINE_JUDGE
    freopen("in", "r", stdin);
    freopen("out", "w", stdout);
#endif
    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);

    cin >> x;
    rep(i, 4) {
        cin >> cnt[i];
    }
    cache[0] = 1;

    rep(i, 4) {
        for (int j = x; j >= 0; --j) {
            if (cache[j]) {
                for (int k = 1; k <= cnt[i]; ++k) {
                    int nxt = j + coin[i] * k;

                    if (nxt > x)
                        break;
                    if (get_max(cache[nxt], cache[j] + k)) {
                        par[nxt] = nxt - coin[i];
                    } else
                        break;
                }
            }
        }
    }

    if (!cache[x])
        cout << "0 0 0 0";
    else {
        while (x) {
            used[x - par[x]]++;
            x = par[x];
        }
        cout << used[1] << ' ' << used[5] << ' ' << used[10] << ' ' << used[25];
    }

    return 0;
}

'Algorithm' 카테고리의 다른 글

[백준 18321] Wormhole sort  (3) 2020.11.05
[백준 11438] LCA2  (0) 2020.11.04
[백준 18879] The Moo Particle  (0) 2020.11.01
[백준 11562] 백양로 브레이크  (0) 2020.10.29
[백준 14932] 금고(SAFE)  (0) 2020.10.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함