

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원의 결과가 나왔습니다.