🔗 문제 링크
12865번: 평범한 배낭
첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)
www.acmicpc.net
🔎 문제 풀이
평범한 배낭이지만 절대 평범하지가 않다.
알고 보니 배낭 문제 (knapsack problem)로 Dynamic Programming의 대표적인 문제라고 한다.
Knapsack Algorithm이라고도 불리는 배낭 문제는 두 가지 문제로 분류된다.
짐을 쪼갤 수 있는 경우와, 짐을 쪼갤 수 없는 경우이다.
전자는 Fraction Knapsack Problem이라고 하고, Greedy를 사용한다.
후자는 0/1 Knapsack Problem이라고 하고, 보통 DP를 사용한다.
나무위키와 블로그를 참고해서 배낭 문제에 대해 이해했다.
배낭 문제 - 나무위키
무게 대비 가치가 다른 물건들을 일정한 용량의 용기에 담아야 한다는 기본 틀에서, 바리에이션이 많다. 가방이 여러 개인 문제, 고려할 변수가 무게와 가치 외에도 더 있는 3개 이상의 변수 문
namu.wiki
Dynamic Programming: 배낭 채우기 문제 (Knapsack Problem)
도둑이 보석가게에 배낭을 메고 침입했다. 배낭의 최대 용량은 W이며, 이를 초과해서 보석을 담으면 배낭이 찢어질 것이다. 각 보석들의 무게와 가격은 알고 있다. 배낭이 찢어지지 않는 선에서
gsmesie692.tistory.com
이 문제는 짐을 쪼갤 수 없는 경우이므로 DP로 푼다.
아래 블로그에 나오는 테이블 그림을 참고하면 이해하는데 도움이 된다.
[백준] 12865번 평범한 배낭 (자바 풀이)
문제 https://www.acmicpc.net/problem/12865 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무
code-lab1.tistory.com
Java 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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[][] dp = new int[N + 1][K + 1];
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
int W = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());
for (int j = 1; j <= K; j++) {
if (j < W) {
dp[i][j] = dp[i - 1][j];
continue;
}
dp[i][j] = Math.max(V + dp[i - 1][j - W], dp[i - 1][j]);
}
}
System.out.println(dp[N][K]);
}
}
'Algorithms > BOJ' 카테고리의 다른 글
백준 9663번, N-Queen : Java (0) | 2023.01.21 |
---|---|
백준 11729번, 하노이 탑 이동순서 : Java (0) | 2022.12.28 |
백준 2447번, 별 찍기 - 10 : Java (0) | 2022.12.27 |