01 knapsack
이라는 정형화된 알고리즘 문제입니다.배낭의 남은 무게
를 기준으로 접근해야 합니다.
import java.util.*;
public class Main {
static class material{ // 물건의 무게와 가치를 담기 위한 클래스
int W,V;
public material(int w, int v) {
super();
W = w;
V = v;
}
@Override
public String toString() {
return "material [W=" + W + ", V=" + V + "]";
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringTokenizer st = new StringTokenizer(sc.nextLine()," ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
material[] M = new material[N]; // 물건을 담을 배열
for (int i = 0; i < N; i++) {
st = new StringTokenizer(sc.nextLine()," ");
M[i] = new material(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
}
int[] dp = new int[K+1]; // 여유공간이 0일때부터 K일때까지를 나타내는 dp배열
dp[0] = 0;
for (int j = 0; j < N; j++) { // 물건
for (int i = K; i >= M[j].W; i--) { // 남은 무게
if(i-M[j].W<0)continue; // 여유공간보다 물건이 더 무거우면 패스
dp[i] = Math.max(dp[i],dp[i-M[j].W]+ M[j].V); //
//i = 7, j물건의 무게 = 3, j물건의 가치 = 6이라고 할 때
//이전에 구한(==다른j로 구한) 7로 채울 수 있는 최댓값과 현재 j를 넣었을 때의 값을 비교합니다
//j를 넣었을 때의 가치는 'j의 가치 + (i-j의 무게)일때 최적의 가치' 입니다
}
}
// System.out.println(Arrays.toString(dp));
System.out.println(dp[K]);
}
}
1 2
1 3
가방에 2kg의 여유무게가 있고 [1kg,3원]의 물건이 있을 때
물건은 하나씩만 존재하기 때문에 1kg물건을 1번 담고 1kg의 빈 공간을 남긴 3원의 결과가 나와야 하는데
제 알고리즘은 이를 고려하지 못하고 1kg물건을 2번 담아 6원의 결과가 나왔습니다.