[BOJ 12865] 평범한 배낭
업데이트:
문제
- BOJ 12865
- 문제의 저작권은 Baekjoon Online Judge에 있습니다.
접근방식
현재 물건(i)에서 현재 무게(j)까지 올 때 까지의 최대 가치를 dp[i][j]를 저장한다.
-
i번째 물건을 넣을 때 j무게까지 넣는 최대 가치가 이전에 저장되어 있으므로 처음엔 이전 가치를 무조건 넣는다. →
dp[i][j] = dp[i - 1][j]
-
만약, j-현재무게를 했을 때 남는 무게가 있으면 더 큰 가치를 구할수도 있으므로 현재 무게를 넣었을 때와 j-현재무게일때의 최대 가치를 더해서 1번값과 비교한다.
→
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i])
import java.io.*;
import java.util.*;
//평범한 배낭
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int N, K; // 물건 개수, 버틸 수 있는 무게
static int[] w;
static int[] v;
static int[][] dp; // 물건번호, 현재 무게까지 온 최대 가치
public static void main(String[] args) throws NumberFormatException, IOException {
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
w = new int[N + 1];
v = new int[N + 1];
dp = new int[N + 1][K + 1];
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
w[i] = Integer.parseInt(st.nextToken());
v[i] = Integer.parseInt(st.nextToken());
} // End input
for (int i = 1; i <= N; i++) { //물건 번호
for (int j = 1; j <= K; j++) { //현재 무게
dp[i][j] = dp[i - 1][j]; // 이전 가치 저장
if (j - w[i] >= 0) { // 남는 무게가 있으면 이전 가치 vs 남은무게가치 + 현재가치 비교
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
}
}
System.out.println(dp[N][K]);
}
}