반응형
05-15 00:00
Today
Total
«   2024/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
관리 메뉴

개발하는 고라니

[백준] 2294번 : 동전 2 본문

Programming/백준

[백준] 2294번 : 동전 2

조용한고라니 2021. 2. 6. 17:04
반응형
 

2294번: 동전 2

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

www.acmicpc.net

# 문제

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

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

# 입력

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

# 출력

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

# 예제 입력

3 15

1

5

12

# 예제 출력

3


[메모제이션(동적 프로그래밍)]

 

2293번: 동전 1

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

www.acmicpc.net

백준의 동전 시리즈 문제이다. 동전 1은 n개의 각 동전으로 k원을 만들 수 있는 경우의 수를 구하는 문제였다면, 동전 2는 n개의 각 동전으로 k원을 만들 때 그 개수의 최소값을 찾는 문제이다.

 

dp[]에 i원을 만들 때 사용되는 동전의 최소값을 저장한다. 이 때 k는 10000 이하이지만, 범위에 주의해야한다. 동전의 최대값은 100,000이기 때문이다. 그리고 dp[]는 INF로 초기화한다.

 

dp[j]에 값을 저장하기 전에 tmp라는 임시 변수에 dp[ j - coin[i] ] + 1를 저장하고, dp[j]와 비교했을 때 tmp가 더 작은 값이면 그 때 dp[j]에 값을 넣도록 하자.

# Code </>

public class Main {

    static final int INF = 1000000000;
    static int[] dp = new int[100001], coin = new int[101];
    static int n, k;

    static void Dynamic(){

        for(int i=1; i<=n; i++){
            dp[ coin[i] ] = 1;

            for(int j=coin[i]; j<=k; j++){
                int tmp = dp[j - coin[i]] + 1;

                dp[j] = tmp < dp[j]? tmp : dp[j];
            }
        }
        System.out.println(dp[k] == INF? -1:dp[k]);
    }

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

        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        for(int i=1; i<=n; i++)
            coin[i] = Integer.parseInt(br.readLine());

        Arrays.fill(dp, INF);
        Dynamic();
    }
}
반응형
Comments