algorithm/DP

BOJ-12865

아르비스 2019. 11. 15. 12:34

https://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

일반적인 배낭 문제로 1차원 DP로 풀이가 가능했다.

D[무게] = {최대Value}

입력받은 V, W 값을 기준으로 각 무게별 Item을 추가했을때 최대 가치를 구하도록 했음.

 

 

 

코드

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

public class Main {
    static int N, K;
    static int[] D;
    public static void main(String[] args) throws IOException {
        //System.setIn(new FileInputStream("res/input_boj12865.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine().trim(), " ");
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());

        D = new int[K+1];

        D[0] = 0;
        int w, v;
        int result = 0;
        for (int i = 0; i < N ; i++) {
            st = new StringTokenizer(br.readLine().trim(), " ");
            w = Integer.parseInt(st.nextToken());
            v = Integer.parseInt(st.nextToken());
            for (int j = K-w; j > -1  ; j--) {
                D[j+w] = Math.max(D[j+w], D[j]+v);
                if(result<D[j+w]) result = D[j+w];
            }
        }
        System.out.println(result);
    }
}