본문 바로가기

ALGORITHM

백준 12865 평범한 배낭 (Java)

1. 문제 링크

 

12865번: 평범한 배낭

첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

전형적인 DP 문제이다.

해당 무게가 되는지 여부를 알고 지금 물건의 가치가 더 높은지 판단해서 저장한다.

 

4. 코드

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] split = br.readLine().split(" ");
		int N = Integer.parseInt(split[0]); //물건 개수
		int W = Integer.parseInt(split[1]); //가방 최대 무게
		
		int[] weight = new int[N+1];
		int[] value = new int[N+1];
		
		for(int i=0;i<N;i++) {
			split = br.readLine().split(" ");
			weight[i+1] = Integer.parseInt(split[0]);
			value[i+1] = Integer.parseInt(split[1]);
		}
		
		int[][] D = new int[N+1][W+1];
		
		for(int i=1;i<N+1;i++) { //물건
			for(int w=1;w<W+1;w++) { //가방 무게
				//해당 물건의 무게가 w를 초과하는지
				if(weight[i]>w) {
					D[i][w] = D[i-1][w];
				}
				else {
					D[i][w] = Math.max(D[i-1][w], value[i]+D[i-1][w-weight[i]]);
				}
			}
		}
		System.out.println(D[N][W]);
	}
}

 

'ALGORITHM' 카테고리의 다른 글

백준 14719 빗물 (Java)  (0) 2023.04.19
백준 2636, 2638 치즈 (Java)  (0) 2023.04.18
백준 2206 벽 부수고 이동하기 (Java)  (0) 2023.04.17
백준 21318 피아노 체조 (Java)  (0) 2023.04.17
백준 10775 공항 (Java)  (0) 2023.04.16