배낭 문제를 DP로 접근해 보자.
먼저 배낭 문제의 부분 문제를 찾아내기 위해 문제의 주어진 조건을 살펴보면
이 중에서 물건과 물건의 무게는 부분 문제를 정의하는데 반드시 필요하다.
왜냐하면 배낭이 비어 있는 상태에서 시작하여 물건을 하나씩 배낭에 담는 것과 안 담는 것을 현재 배낭에 들어 있는 물건의 가치의 합에 근거하여 결정해야 하기 때문이다.
또한 물건을 배낭에 담으려고 할 경우에 배낭 용량의 초과 여부를 검사해야 한다.
따라서 배낭 문제의 부분문제를 아래와 같이 정의할 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_12865_G5_평범한_배낭_2차원_dp {
static int N, K, W, V;
static int[] weights;
static int[] values;
static int[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
weights = new int[N+1];
values = new int[N+1];
dp = new int[N+1][K+1];
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
weights[i] = Integer.parseInt(st.nextToken());
values[i] = Integer.parseInt(st.nextToken());
}
for (int i = 1; i <= N; i++) {
for (int j = 0; j <= K; j++) {
if (j >= weights[i]) {
dp[i][j] = Math.max(dp[i-1][j-weights[i]] + values[i], dp[i-1][j]);
}else{
dp[i][j] = dp[i-1][j];
}
}
}
System.out.println(dp[N][K]);
br.close();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_12865_G5_평범한_배낭_1차원_dp {
static int N, K, W, V, answer;
static int[] weights;
static int[] values;
static int[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
weights = new int[N];
values = new int[N];
dp = new int[K+1];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
weights[i] = Integer.parseInt(st.nextToken());
values[i] = Integer.parseInt(st.nextToken());
}
for (int i = 0; i < N; i++) {
for (int j = K; j >= weights[i]; j--) {
dp[j] = Math.max(dp[j - weights[i]] + values[i], dp[j]);
}
}
System.out.println(dp[K]);
br.close();
}
}