동전 2 2294

LJM·2023년 7월 31일
0

백준풀기

목록 보기
211/259

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

DP는 어렵다..

각 동전의 가치를 coin이라고 할 때, 금액 i를 만드는 데 필요한 최소 동전의 개수는 다음 두 가지 방법 중 하나로 만들 수 있다

이전에 계산한 dp[i]의 값 (현재 동전을 사용하지 않는 경우)
dp[i - coin] + 1의 값 (현재 동전을 사용하는 경우)
이 둘중에 작은것을 선택하여 dp[i]에 갱신한다

점화식
dp[j] = Math.min(dp[j], dp[j-coin[i]]+1);
j = 현재목표금액(최소의 동전을 사용해서)

'coin[i]' 를 사용하는 경우
j(현재만들고자하는금액) - coni[i](동전을 사용하므로 뺀다)
= 이전에 구했던 만들고자 하는 금액에 최소 필요한 동전개수 + 1(새로운 동전을 사용했으므로)

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(" ");

        int n = Integer.parseInt(input[0]);
        int k = Integer.parseInt(input[1]);

        int[] dp = new int[k+1];

        Integer[] coin = new Integer[n];
        for (int i = 0; i < n; i++) {
            coin[i] = Integer.parseInt(br.readLine());
        }

        Arrays.sort(coin);
        Collections.reverse(Arrays.asList(coin));

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

        for (int i = 0; i < n; i++) {
            for (int j = coin[i]; j <= k; j++) {
                dp[j] = Math.min(dp[j], dp[j-coin[i]]+1);
            }
        }

        if(dp[k] == k+1)
            System.out.println(-1);
        else
            System.out.println(dp[k]);
    }
}
profile
게임개발자 백엔드개발자

0개의 댓글