본문 바로가기
알고리즘

[JAVA]백준 2624번: 동전 바꿔주기

by Kwoncorin 2021. 3. 3.
728x90

www.acmicpc.net/problem/2624

 

2624번: 동전 바꿔주기

명보네 동네 가게의 현금 출납기에는 k 가지 동전이 각각 n1, n2, … , nk개 씩 들어있다. 가게 주인은 명보에게 T원의 지폐를 동전으로 바꿔 주려고 한다. 이때, 동전 교환 방법은 여러 가지가 있을

www.acmicpc.net

1. 문제 설명

 

지폐의 금액 T와 동전의 가짓수 K, 각 동전 하나의 금액 pi와 개수 ni가 주어질 때 지폐를 동전으로 교환하는 방법의 가지 수를 구하는 문제이다.

 

2. 풀이

 

dp[x]= 현재 금액이 x일 때 동전으로 교환하는 방법의 가지 수

 

pi 금액의 가지수가 중복으로 포함되지 않도록 dp [x]에 대해 아직 pi 금액을 이용한 가짓수가 포함되지 않은 dp [x-ni*pi]의 값을 더했다.

 

3. 코드

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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int target, num;


        target = Integer.parseInt(br.readLine());
        num = Integer.parseInt(br.readLine());

        int[][] list = new int[num][2];
        int[] dp = new int[target + 1];

        for (int x = 0; x < num; x++) {

            StringTokenizer st = new StringTokenizer(br.readLine());

            list[x][0] = Integer.parseInt(st.nextToken());
            list[x][1] = Integer.parseInt(st.nextToken());
        }

        dp[0] = 1;

        for (int y = 0; y < num; y++) {

            int base = list[y][0];

            for (int x = target; x >= base; x--) {

                for (int w = 1; w <= list[y][1]; w++) {

                    if (x - base * w < 0) {
                        break;
                    }

                    dp[x] += dp[x - base * w];

                }
            }
        }


        bw.write(String.valueOf(dp[target]));
        bw.flush();
        bw.close();
        br.close();

    }



}

728x90

'알고리즘' 카테고리의 다른 글

[JAVA]백준 2758번: 로또  (0) 2021.03.05
[JAVA]백준 2631번: 줄세우기  (0) 2021.03.04
[JAVA]백준 15724번: 주지수  (0) 2021.03.02
[JAVA]백준 1823번: 수확  (0) 2021.02.26
[JAVA]백준 18427번: 함께 블록 쌓기  (1) 2021.02.26