Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

MG

[백준] 2294 - 동전 2 본문

컴퓨터과학/알고리즘_PS

[백준] 2294 - 동전 2

MG# 2022. 5. 4. 22:54

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

 

2294번: 동전 2

첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주

www.acmicpc.net

동전 k일때 동전의 최소 개수를 구하는 문제입니다. 저는 0원부터 k원까지 dp를 완성해서 푸는 방식으로 해결하였습니다. dp를 모두 INF로 초기화시키고 1원부터 k원까지 dp를 돌려줍니다. dp[i]를 초기화할때 동전 벡터를 전부 돌려가면서 dp[i]랑 dp[i - 동전] 을 비교해 더 작은 값을 저장합니다. 이때 i - 동전이 0 이상일때와 dp가 INF가 아닐 때만 초기화 해줍니다. 그리고 마지막에 dp가 INF면 도달할 수 없는 값이므로 -1을 출력하고 아니면 dp[k]를 출력합니다.

#include <iostream>
#include <vector>
#define MAX 10001
#define INF 100000000
using namespace std;

vector<int> v;
int dp[MAX];
int n, k, tmp;

int main() {

    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> tmp;
        v.push_back(tmp);
    }

    dp[0] = 0;
    for (int i = 1; i <= k; i++)
        dp[i] = INF;

    for (int i = 1; i <= k; i++)
        for (auto j : v)
            if (i - j >= 0 && dp[i - j] != INF)
                dp[i] = min(dp[i], dp[i - j] + 1);

    if (dp[k] == INF)
        cout << "-1\n";
    else
        cout << dp[k] << "\n";

    return 0;
}

'컴퓨터과학 > 알고리즘_PS' 카테고리의 다른 글

[백준] 2156 - 포도주 시식  (0) 2022.05.06
[백준] 2407 - 조합  (0) 2022.05.05
[백준] 1629 - 곱셈  (0) 2022.05.04
[백준] 1890 - 점프  (0) 2022.05.02
[백준] 2141 - 우체국  (0) 2022.05.01