백준/동적 계획법
[백준] 12865 - 평범한 배낭 [JAVA]
odong2
2024. 4. 29. 17:49

코드(Top-down)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
static Integer[][] dp;
static int[] W; // weight
static int[] V; // value
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());
W = new int[N];
V = new int[N];
dp = new Integer[N][K + 1];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
W[i] = Integer.parseInt(st.nextToken());
V[i] = Integer.parseInt(st.nextToken());
}
// Top-down
System.out.println(solution(N - 1, K));
}
static int solution(int i, int k) {
// i가 0 미만, 범위 밖
if (i < 0) {
return 0;
}
if (dp[i][k] == null) {
// 수용 가능 무게를 초과한 경우
if (W[i] > k) {
// 이전 i 값 탐색
dp[i][k] = knapsack(i - 1, k);
}
// 수용 가능 하다면
else {
dp[i][k] = Math.max(knapsack(i - 1, k), knapsack(i - 1, k - W[i]) + V[i]);
}
}
return dp[i][k];
}
}
코드(Bottom-up)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
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[] W = new int[N + 1]; // 무게
int[] V = new int[N + 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());
}
int[][] dp = new int[N + 1][K + 1];
// Bottom-up
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= K ; j++) {
// 수용 가능한 무게보다 크면 이전 요소값
if (W[i] > j) {
dp[i][j] = dp[i - 1][j];
}
// 수용 가능하면
else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - W[i]] + V[i]);
}
}
}
System.out.println(dp[N][K]);
}
}