λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

μ•Œκ³ λ¦¬μ¦˜ 문제

2293 - 동전 1

문제boj.kr/2293
λ‚ μ§œ: 09/22 (일)
성곡여뢀: X

 

1, 2, 5원 동전을 κ°–κ³  10원을 λ§Œλ“ λ‹€κ³  ν•˜λ©΄ 1μ›λ§Œ μ¨μ„œ λ§Œλ“œλŠ” 경우의 수, 1원과 2원을 μ¨μ„œ λ§Œλ“œλŠ” 경우의 수, 1원 2원 5원을 λͺ¨λ‘ μ‚¬μš©ν•΄μ„œ λ§Œλ“œλŠ” 경우의 수둜 λ‚˜λˆŒ 수 μžˆλ‹€. 1원을 λ¨Όμ € μ¨μ„œ λ§Œλ“œλŠ” 경우의 수λ₯Ό ꡬ해놓고 2원을 μ¨μ„œ λ§Œλ“œλŠ” 경우의 수λ₯Ό λ”ν•˜λ©΄ 1원과 2μ›μœΌλ‘œ 10원을 λ§Œλ“œλŠ” 경우의 수λ₯Ό 찾을 수 μžˆμ§€ μ•Šμ„κΉŒ?

 

그럼 쀑볡은 μ–΄λ–»κ²Œ μ œκ±°ν•˜λƒ? 1μ›μœΌλ‘œλ§Œ 2원뢀터 10μ›κΉŒμ§€ λ§Œλ“  경우의 μˆ˜κ°€ μžˆλŠ” μƒν™©μ—μ„œ 2원을 무쑰건 νˆ¬μž…ν•œλ‹€κ³  μƒκ°ν•΄λ³΄μž. 그럼, 2μ›μœΌλ‘œ 2원을 λ§Œλ“€κΈ° μœ„ν•΄ 2원 ν•˜λ‚˜λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. 1+1, 2 2κ°€μ§€κ°€ μžˆλŠ” κ²½μš°μ΄λ―€λ‘œ μ›λž˜ 1+1 경우의 μˆ˜μ— 2둜 λ§Œλ“  경우의 수 = 2κ°€ λœλ‹€.

 

3μ›μ˜ 경우 1+1+1은 μ›λž˜ μžˆμ—ˆκ³  2원이 νˆ¬μž…λ˜λ©΄ 1+2κ°€ μžˆλ‹€. μ΄λŠ” 1μ›μœΌλ‘œ 1원을 λ§Œλ“  경우의 μˆ˜μ— 2μ›λ§Œ λΆ™μ—¬μ£Όλ©΄ λ˜λ‹ˆκΉŒ κ²°κ΅­, 1μ›μœΌλ‘œ 1원을 λ§Œλ“  경우의 수λ₯Ό μΆ”κ°€λ‘œ λ”ν•˜λ©΄ λœλ‹€. 2+1도 μžˆμ§€μ•Šλƒκ³  ν•  수 μžˆμ§€λ§Œ, 2μ›μœΌλ‘œ 2원을 λ§Œλ“  경우의 μˆ˜μ— 1원을 μΆ”κ°€λ‘œ λ”ν•œ 것인데 μš°λ¦¬λŠ” 항상 λ§ˆμ§€λ§‰μ— 2원을 μ‚¬μš©ν• κ±°κΈ° λ•Œλ¬Έμ— μƒκ°ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

4μ›μ˜ 경우 1+1+1+1 경우의 수λ₯Ό κ΅¬ν•œ μƒνƒœμ΄κ³ , μΆ”κ°€λ‘œ 1+1+2와 2+2 경우의 μˆ˜κ°€ μžˆλ‹€. μ΄λŠ” 1둜 2λ₯Ό λ§Œλ“œλŠ” 경우의 μˆ˜μ™€ 2둜 2λ₯Ό λ§Œλ“œλŠ” 경우의 수 즉, 1원과 2μ›μœΌλ‘œ 2원을 λ§Œλ“œλŠ” 경우의 수 + 1μ›μœΌλ‘œ 4원을 λ§Œλ“  경우의 μˆ˜κ°€ λœλ‹€.

 

계속 μ΄λŸ°μ‹μœΌλ‘œ λ‚˜μ•„κ°€λ©΄ λ‹€μŒκ³Ό 같은 ν…Œμ΄λΈ”μ΄ μ™„μ„±λœλ‹€.

 

dp
0
1
2
3
4
5
6
7
8
9
10
1원
1
1
1
1
1
1
1
1
1
1
1
2원
1
1
2
2
3
3
4
4
5
5
6
5원
1
1
2
2
3
4
5
6
7
8
10

 

즉, 1μ›λ§Œ μ¨μ„œ λ§Œλ“  경우의 μˆ˜μ— 2원을 μΆ”κ°€ νˆ¬μž…ν•΄λ³΄κ³ , 5원을 μΆ”κ°€ νˆ¬μž…ν•΄λ³΄λŠ” 것이닀. 이럼 쀑볡없이 λͺ¨λ“  경우의 수λ₯Ό ꡬ할 수 μžˆλ‹€. μ™œλƒλ©΄ μœ„μ— λ§ν–ˆλ“―μ΄ 무쑰건 μΆ”κ°€ νˆ¬μž…ν•œ 동전을 λ§ˆμ§€λ§‰μ— μ‚¬μš©ν•˜λ„λ‘ ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

 

μ½”λ“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static int[] dp;
    static int n, 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());

        dp = new int[k+1];

        dp[0] = 1;
        for (int i = 0; i < n; i++) {
            int tmp = Integer.parseInt(br.readLine());
            if (tmp > 10000) continue;
            for (int j = tmp; j <= k; j++)
                dp[j] += dp[j - tmp];
        }

        System.out.println(dp[k]);
    }
}