배낭문제

AI·2025년 9월 10일

https://www.acmicpc.net/problem/12865

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static int[][] dp;
    static int[] P, V; // 무게, 가치
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

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

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

        dp = new int[n][k+1];
        for (int i = 0; i < n; i++) Arrays.fill(dp[i], -1); //dp 초기화

        int ans = knapsack(n-1,k);
        bw.write(String.valueOf(ans));

        bw.flush();
        bw.close();
        br.close();
    }

    static int knapsack(int i, int w){
        if(i<0) return 0;
        if (dp[i][w] != -1) return dp[i][w]; // 값이 없다면

        if(P[i] > w){
            dp[i][w] = knapsack(i-1, w);
        }
        else if(P[i] <= w){
            dp[i][w] = Math.max(knapsack(i-1,w), knapsack(i-1,w-P[i])+V[i]);
        }

        return dp[i][w];
    }
}

0개의 댓글