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);
}
}