문제 링크

분류

다이나믹 프로그래밍

문제 설명

n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.

사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.

입력

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

출력

첫째 줄에 사용한 동전의 최소 개수를 출력한다. 불가능한 경우에는 -1을 출력한다.

풀이 (동적프로그래밍 - 바텀 업)

시간 복잡도 O(n) 공간 복잡도 O(n)

가치의 합에 대한 코인의 필요 갯수를 저장해두는 dp[] 배열을 사용해서 1~k까지의 반복을 통해 코인의 필요 갯수를 재갱신하여 풀었다.

j 원을 만들기위한 방법 = 기존에 갱신한 j원을 만드는데 필요한 동전의 vs j-n원을 만들기 위한 동전의 + n 짜리 동전 하나

import java.io.*;
import java.util.*;

public class Main {
    public static int sti(StringTokenizer st){
        return Integer.parseInt(st.nextToken());
    }
    public static long stl(StringTokenizer st){
        return Long.parseLong(st.nextToken());
    }
    static final int INF = (int)10e9;

    public static void main(String[] args)throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        int[] coins = new int[n+1];
        for(int i=1; i<=n; i++) {
            coins[i] = Integer.parseInt(br.readLine());
        }

        int[] dp = new int[k+1];
        Arrays.fill(dp, 100001);  // Impossible value
		// 0원을 만드는데 필요한 코인 수는 0개
        dp[0] = 0;
        for(int i=1; i<=n; i++) {
            for(int j=coins[i]; j<=k; j++) {
                dp[j] = Math.min(dp[j], dp[j-coins[i]] + 1);
            }
        }

        if (dp[k] == 100001) {
            System.out.println(-1);
        } else {
            System.out.println(dp[k]);
        }
    }
}

'PS > Gold' 카테고리의 다른 글

[Gold V] 전깃줄 - 2565 (Java)  (0) 2023.07.25
[Gold V] 퇴사 2 - 15486 (Java)  (0) 2023.07.24
[Gold V] 호텔 - 1106 (Java)  (0) 2023.07.23
[Gold III] 우주선 만들기 - 15912 (Java)  (0) 2023.07.22
[Gold II] 직각다각형 - 17611  (0) 2023.07.19

+ Recent posts