PS
[백준] 12865번 : 평범한 배낭[Java]
devkdh
2025. 7. 10. 13:21

#풀이
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]