출처 : https://www.acmicpc.net/problem/12865
풀이 방법,
이번 문제는 0-1 배낭 문제(0-1 Knapsack Problem)로, 1차원 DP를 활용하여 최적의 해결법을 찾는다.
DP 배열을 사용하여 주어진 무게 제한 내에서 최대 가치를 찾는 방식으로 풀이하였다.
1. DP 배열 정의
• dp[j] → 무게 j일 때 배낭에 담을 수 있는 최대 가치를 저장
• 초기값은 0으로 설정
2. 각 물건을 순회하며 DP 테이블 갱신
• 현재 물건을 넣을 수 있는 최대 무게부터 역순으로 탐색 (이전 값이 유지되도록)
• 현재 가방을 선택하는 경우 vs. 선택하지 않는 경우를 비교하여 dp 갱신
dp[j] = max(dp[j], dp[j - weight] + value)
import java.io.*;
import java.util.*;
public class P_12865 {
static int n, k;
static int[] dp = new int[100001];
static public class BackPack{
int weight, value;
BackPack(int weight, int value) {
this.weight = weight;
this.value = value;
}
}
static ArrayList<BackPack> backPacks = new ArrayList<>();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken()); // 배낭의 수
k = Integer.parseInt(st.nextToken()); // 제한 무개
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
backPacks.add(new BackPack(Integer.parseInt(st. nextToken()), Integer.parseInt(st.nextToken())));
}
for (int i = 0;i < backPacks.size();i++){
for (int j = k;j >= backPacks.get(i).weight;j--) {
dp[j] = Math.max(dp[j], dp[j - backPacks.get(i).weight] + backPacks.get(i).value);
}
}
System.out.println(dp[k]);
}
}
'Algorithm' 카테고리의 다른 글
[백준] 중앙 트리 7812번 (java) 트리에서 dp (1) | 2025.02.23 |
---|---|
[백준] 전구와 스위치 2138번 (c++) 그리디 (0) | 2025.02.19 |
[백준] 소가 길을 건너간 이유 6 (java) (0) | 2025.02.17 |
[백준] 온풍기 안녕! (c++) (0) | 2025.02.16 |
[백준] 등산 마니아 20188번 (c++) (0) | 2025.02.15 |