접근

우선 이 블로그에서 냅색 알고리즘을 공부한 뒤 문제를 풀었다. 자꾸 내 머리로 생각을 안하고 블로그에서 본 점화식을 은연중에 따라하려고 해서 자꾸 답은 안나오는데 이유는 모르겠고 더 헤맸던 것 같다. 아예 작성하던 코드를 버리고 처음부터 내 방식대로(나는 물건 인덱스가 첫 번째 차원에 오는게 더 이해하기 쉬운 것 같다) 풀었더니 금방 성공했다. 

 

여기서 주의할 점은, (현재 수납 가능한 무게) - (넣고자 하는 물건의 무게)가 음수가 될 때의 처리인 것 같다. 나는 처음에 continue만 했기 때문에 최종 결과값이 0이 나오기도 했었다. dp 배열값은 항상 갱신해줘야 함에 유의하자. 

 

코드

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

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

        // 입력값 저장
        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());
        int[] weights = new int[n];
        int[] values = new int[n];
        
        for(int i = 0;i < n;i++){
            st = new StringTokenizer(br.readLine());
            weights[i] = Integer.parseInt(st.nextToken());
            values[i] = Integer.parseInt(st.nextToken());
        }

        // 냅색 알고리즘
        int answer = solve(weights, values);
        
        // 결과 출력
        System.out.println(answer); 
    }

    static int solve(int[] weights, int[] values){
        int result = 0;
        int[][] dp = new int[n+1][k+1];  // dp[i][j] = i번째 물건까지 넣었을 때, j 무게까지의 최대 가치

        for(int i = 1;i <= n;i++){
            int weight = weights[i-1];
            int value = values[i-1];
            
            for(int j = 1;j <= k;j++){
                if(j < weight) {
                    dp[i][j] = dp[i-1][j];
                    continue;
                }
                
                int curMaxVal = Math.max(dp[i-1][j], dp[i-1][j-weight] + value);
                dp[i][j] = curMaxVal;
                result = Math.max(result, curMaxVal);
            }
        }

        return result;
    }
}

 

'Algorithm' 카테고리의 다른 글

[백준] 11403: 경로 찾기 JAVA  (0) 2025.02.28
[백준] 9084: 동전 JAVA  (0) 2025.02.14
[백준] 13904: 과제 JAVA  (0) 2023.03.20
[백준] 1374: 강의실 JAVA  (0) 2023.03.20
[백준] 11286: 절댓값 힙 JAVA  (0) 2023.03.20

+ Recent posts