[DP] 백준. 2294 동전 2

김성인·2024년 1월 30일
0

백준

목록 보기
8/10

  • 1) 현재 만드려는 금액이, 현재 선택하려는 코인의 금액보다 작을 때
    • 이전에 현재 금액을 만들 수 있었던 경우의 수를 선택
      dp[i][j] = dp[i-1][j]
  • 2) 현재 만드려는 금액이, 현재 선택하려는 코인의 금액보다 크거나 같을 때
    • 2-1) 현재 선택한 코인 1개로만 해당 금액을 만들 수 있을 때
      • dp[i][j] = 1
    • 2-2) 현재 만드려는 금액에서 선택한 코인을 뺀 값이 만들어져 있지 않을 때
      • dp[i][j] = dp[i-1][j]
    • 2-3) 1개로도 금액을 못 만들고, 현재 만드려는 금액에서 선택한 코인을 뺀 값이 존재할 때
      • dp[i][j] = Math.min(dp[i][gap] + 1, dp[i-1][j])

2-2) 조건에 2-1)번 조건을 같이 묶으려고 했었을 때, 만들 수 없는 금액에 동전 선택의 경우의 수가 할당 되버림 if(dp[i][gap] == 0 || gap != 0) 모두 0으로 만들어 져 버림.

그래서 gap != 0이 부분 빼버리고 그냥 진행하려고,

if(gap < 0){
     dp[i][j] = dp[i-1][j];
}
else{ // gap >= 0
    if(dp[i][gap] == 0){
        dp[i][j] = dp[i-1][j];
    }else{
        dp[i][j] = Math.min(dp[i][gap] + 1 , dp[i-1][j]);
    }
}

이런식으로 해버리니까 만들 수 없는 금액에 동전의 경우의 수가 할당 되어 버림
6에서 1개의 개수로 만들 수 있다고 나옴;;


public class BackJoonMemo {


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

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

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

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


        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= k; j++){
                int gap = j - coins[i-1];
                if(gap < 0){
                    dp[i][j] = dp[i-1][j];
                }else{ // gap >= 0
                    if(gap == 0){
                        dp[i][j] = 1;
                    }
                    else if(dp[i][gap] == 0){
                        dp[i][j] = dp[i-1][j];
                    }
                    else{
                        if(dp[i][gap] != 0){
                            dp[i][j] = dp[i][gap] + 1;
                            if(dp[i-1][j] != 0){
                                dp[i][j] = Math.min(dp[i][j], dp[i-1][j]);
                            }
                        }

                    }
                }
            }
        }


        /*for(int i = 1; i<=n; i++){
            System.out.print(coins[i-1] + " ");
            for(int j = 0; j<= k; j++){
                System.out.print(j + " : " + dp[i][j] + ", ");
            }
            System.out.println();
        }*/


        System.out.println(dp[n][k] == 0 ? -1 : dp[n][k]);
    }
}
profile
개발자가 꿈인 25살 대학생입니다.

0개의 댓글