[백준 알고리즘] 12865번: 평범한 배낭 (Java / 자바)

2025. 4. 24. 10:24·알고리즘/백준

기본 knapsack 문제이다. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class boj_12865 {
	static int N, K, A;
	static int dp[][];
	static int items[][];
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	public static void main(String[] args) throws IOException {
		st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		items = new int[N][2];
		for (int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine());
			items[i][0] = Integer.parseInt(st.nextToken());  // 무게
			items[i][1] = Integer.parseInt(st.nextToken());  // 가치
		}
		
		// dp 테이블 초기화
		dp = new int[N+1][K+1];
		
		for (int i=1; i<=N; i++) {
			for (int w=1; w<=K; w++) {
				// 1. 현재 물건이 현재 용량보다 높은 경우.. 안넣기 (w는 남아있는 배낭의 무게한도를 의미함)
				if (items[i-1][0] > w) dp[i][w] = dp[i-1][w];
				// 2. 무게 안넘어감
				else {
					dp[i][w] = Math.max(dp[i-1][w], dp[i-1][w-items[i-1][0]] + items[i-1][1]);
					// 안넣는 경우 or 넣는 경우 중 최대
				}
			}
		}
		
		System.out.println(dp[N][K]);
	}
}

 

if (items[i-1][0] > w) dp[i][w] = dp[i-1][w];

헷갈린 부분은 현재 물건이 용량을 넘는지 체크할 때 , w(현재 용량)을 넘는지 체크해야하는 것이다.

배낭 무게가 10이라면

배낭 무게가 1일때, 2일때, ... , 10일때 (w일때) 각각의 부분 문제 내에서

최적값을 구해서 w+1에서 w에서 구한 값을 참고해서 최적값을 구한다.

배낭 무게가 w라면 w를 넘는 물건은 넣을 수 없고, 넣을 수 있는 물건들 중에서 넣는 경우와 안넣는 경우 두 가지중에 최선을 선택하면 된다.

저작자표시 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

[백준 알고리즘] 2096번: 내려가기 (Java / 자바)  (0) 2025.04.24
[백준 알고리즘] 11404번: 플로이드 (Java / 자바)  (0) 2025.04.23
[백준 알고리즘] 1865번: 웜홀 (Java / 자바)  (0) 2025.04.23
[백준 알고리즘] 9095번: 1, 2, 3 더하기 (Python / 파이썬)  (0) 2024.02.28
[백준 알고리즘] 1463번: 1로 만들기 (Python / 파이썬)  (0) 2024.02.28
'알고리즘/백준' 카테고리의 다른 글
  • [백준 알고리즘] 2096번: 내려가기 (Java / 자바)
  • [백준 알고리즘] 11404번: 플로이드 (Java / 자바)
  • [백준 알고리즘] 1865번: 웜홀 (Java / 자바)
  • [백준 알고리즘] 9095번: 1, 2, 3 더하기 (Python / 파이썬)
gyujh
gyujh
개발 공부 블로그
  • gyujh
    규
    gyujh
  • 전체
    오늘
    어제
    • 분류 전체보기 (86)
      • Backend&DB (3)
      • CS (5)
        • 컴퓨터구조 (1)
        • 소프트웨어공학 (4)
      • JavaScript (2)
      • Git (2)
      • 알고리즘 (73)
        • 개념 (3)
        • 백준 (70)
      • Projects (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    풀이
    재귀
    딕셔너리
    구현
    답안
    BOJ
    답
    숏코딩
    시간초과
    런타임
    백준
    에러
    알고리즘
    프로그래머스
    스택
    정답
    algorithm
    문자열
    정렬
    너비우선탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
gyujh
[백준 알고리즘] 12865번: 평범한 배낭 (Java / 자바)
상단으로

티스토리툴바