본문 바로가기
알고리즘

[JAVA]백준 2293번: 동전 1

by Kwoncorin 2021. 2. 15.
728x90

www.acmicpc.net/problem/2293

 

2293번: 동전 1

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

www.acmicpc.net

1. 문제 설명

 

n 가지 종류의 동전을 적당히 사용하여 K원을 만들게 하는 경우의 수를 구하시오.

 

2. 풀이

 

2원을 사용하여 5원을 만들고자 한다면 3원까지의 합에 2원을 더해 5원을 만들 수 있다.

 

따라서 동전을 A1, A2.... An이라 하고, 만들고자 하는 가치의 합을 Y라고 한다면

 

dp [Y]=dp [Y-A1]+dp [Y-A2]+...+dp [Y-An]이다.

 

이 점화식을 이용하여

 

새로운 동전을 하나 입력받을 때마다 그 동전을 사용하여 만들 수 있는 경우의 수를 dp 배열에 더하였다.

 

 

시간 복잡도 : O(NK)

 

 

 

3. 코드

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

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));


        int num, sum;

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

        num=Integer.parseInt(st.nextToken());
        sum=Integer.parseInt(st.nextToken());

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


        dp[0]=1;

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

            int base=Integer.parseInt(br.readLine());

            for(int y=base;y<=sum;y++){
                dp[y]+=dp[y-base];
            }
        }


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



    }


}

728x90

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

[JAVA]백준 13549번: 숨바꼭질 3  (0) 2021.02.19
[JAVA]백준 12851번: 숨바꼭질 2  (0) 2021.02.18
[JAVA]백준 1697번: 숨바꼭질  (0) 2021.02.11
[JAVA]백준 2618번: 경찰차  (0) 2021.02.11
[JAVA]백준 9252번: LCS 2  (0) 2021.02.07