프로그래밍 공방

[백준] 12865번 : 평범한 배낭 본문

개발/문제해결

[백준] 12865번 : 평범한 배낭

hyosupsong 2021. 1. 5. 20:08

문제

www.acmicpc.net/problem/12865

 

12865번: 평범한 배낭

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

www.acmicpc.net

문제해결방법

이 문제를 해결하기 위해 DP[N+1][K+1] 배열을 사용했다.

먼저 n번째 꺼낸 물건의 무게와 가치를 w, v 이라고 했을 때, DP[n][k] 를 아래와 같이 채워주었다.

k가 w보다 작은 경우에는 DP[n-1][k] (꺼낸 물건과 관계없이 현재까지의 최대 가치가 변하지 않는다.),

k가 w이상인 경우에는 DP[n-1][k-w]+v 와 DP[n-1][k] 중에 더 큰 값

위 과정을 모두 반복하면 DP[N][K]를 통해 가방에 담을 수 있는 최대 가치를 구할 수 있다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package baekjoon;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main12865_평범한배낭 {
 
    public static void main(String[] args) throws Exception{
        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];
                else DP[i][j] = Math.max(DP[i-1][j], DP[i-1][j-w]+v);
            }
        }
        System.out.println(DP[N][K]);
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.