#풀이
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
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[][] stuff = new int[N][2];
int[][] dp = new int[K+1][N];
int W,V;
for(int i = 0; i<N; i++){
st = new StringTokenizer(br.readLine());
W = Integer.parseInt(st.nextToken());
V = Integer.parseInt(st.nextToken());
stuff[i][0] = W;
stuff[i][1] = V;
}
for(int i =1; i< dp.length; i++){
for(int j = 0; j<dp[i].length; j++){
if(j==0){
if(stuff[j][0]<=i)dp[i][j] = stuff[j][1];
}
else if(i>=stuff[j][0]){
dp[i][j] = Math.max(dp[i-stuff[j][0]][j-1]+stuff[j][1],dp[i][j-1]);
}
else {
dp[i][j] = dp[i][j-1];
}
}
}
System.out.println(dp[K][N-1]);
}
}
#성능

#정리
DP를 이용한 배낭 알고리즘이다.
# dp[i][j]: 최대 무게가 i일 때, 0번부터 j번째 물건까지 고려했을 때의 최대 가치
점화식은 다음과 같다.
물건을 넣을 경우->max(dp[i-(물건의 무게)][j-1]+(물건의 가치),dp[i][j-1])
물건을 넣지 않을 경우-> dp[i][j] = dp[i][j-1]
'PS' 카테고리의 다른 글
[백준] 15686번 : 치킨 배달[Java] (0) | 2025.07.12 |
---|---|
[백준] 1932번 : 정수 삼각형[Java] (2) | 2025.07.10 |
[백준] 11660번 : 구간 합 구하기 5[Java] (2) | 2025.07.09 |
[백준] 16953번 : A->B[Java] (3) | 2025.07.09 |
[백준] 11053번 : 가장 긴 증가하는 부분 수열[Java] (0) | 2025.07.08 |