[백준 12865] 평범한 배낭(Java)

최민길(Gale)·2024년 1월 27일
1

알고리즘

목록 보기
169/172

문제 링크 : https://www.acmicpc.net/problem/12865

이 문제는 DP를 이용하여 풀 수 있습니다. DP 배열을 다음과 같이 설정합니다.

DP[N][K] : N번 아이템까지 K 무게만큼 배낭에 넣었을 때 가치의 최댓값

이후 점화식을 생성합니다.

우선 기본적으로 i번 아이템까지 넣을 때의 가치의 최댓값은 i-1번 아이템까지 넣었을 때의 가치의 최댓값보다 크게 됩니다. 왜냐하면 현재 아이템을 넣기 전의 최댓값을 그대로 가지고 가기 떄문이죠.

그럼 여기서 현재 아이템을 추가할 때의 최댓값 계산을 진행해주시면 됩니다. 즉 i-1번 아이템까지 넣은 최댓값에 현재 아이템의 가치를 추가한 값과 현재 상태와의 최댓값을 계산합니다.

아래는 코드입니다.

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

class Main{
    static int N,K;
    static long[][] dp;
    static int[][] item;

    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());

        item = new int[N+1][2];
        for(int i=1;i<=N;i++){
            st = new StringTokenizer(br.readLine());
            int w = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            item[i][0] = w;
            item[i][1] = v;
        }

        dp = new long[N+1][K+1];
        for(int k=1;k<=K;k++){
            for(int n=1;n<=N;n++){
                dp[n][k] = dp[n-1][k];
                if(k >= item[n][0]){
                    dp[n][k] = Math.max(dp[n][k], dp[n-1][k - item[n][0]]+item[n][1]);
                }
            }
        }
        System.out.println(dp[N][K]);
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글

관련 채용 정보