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];
}
}