import java.util.Arrays;
import java.util.Scanner;
public class bj5350 {
static Scanner scanner = new Scanner(System.in);
static int W;
static int [] w;
static int [] v;
public static void main(String[] args){
int T, i;
T = scanner.nextInt();
for(i = 0; i < T; i++){
inputData();
System.out.println(findAnswer());
}
scanner.close();
}
public static void inputData(){
System.out.println("inputData()");
int n, i;
n = scanner.nextInt();
W = scanner.nextInt();
w = new int[n];
v = new int[n];
for(i = 0; i < n; i++){
w[i] = scanner.nextInt();
v[i] = scanner.nextInt();
}
}
public static int findAnswer(){
System.out.println("findAnswer()");
int i, j;
int n = w.length;
int [] DP = new int[W + 1];
for(i = 0; i < n; i++){
for(j = W; j >= w[i]; j--){
if(j - w[i] >= 0){
DP[j] = Math.max(DP[j], DP[j - w[i]] + v[i]);
}
}
for(j = 1; j <= W; j++){
System.out.print(DP[j] + " ");
}
System.out.println();
}
return DP[W];
}
}
배낭문제(0/1 Knapsack)에서 동적 계획법(DP) 구현 시 1차원 배열과 2차원 배열을 선택하는 것은 주로 공간 효율성과 코드의 가독성에 따라 결정됩니다. 두 방식의 차이와 구분 방법을 살펴보겠습니다.
2차원 배열을 사용하면, dp[i][w]
로 i번째 물건까지 고려했을 때, 배낭의 용량이 w인 경우 최대 가치를 명확히 나타낼 수 있습니다.
i
)에 대해 모든 배낭 용량(w
)에 대해 점화식을 계산.1차원 배열을 사용하면, 이전 단계의 값을 재활용하여 메모리 사용량을 줄일 수 있습니다.
dp[w]
는 현재 배낭 용량 ( w )에서 최대 가치를 나타냄.구분 | 2차원 배열 | 1차원 배열 |
---|---|---|
공간 복잡도 | ( O(n \times W) ) | ( O(W) ) |
메모리 효율성 | 낮음 | 높음 |
구현 난이도 | 쉬움 | 어려움(역순 순회 필요) |
상태 추적 | 명확 (이전 단계 접근 용이) | 어렵다 |
사용 상황 | - 이해와 디버깅이 중요한 경우 - ( W )가 작거나 메모리가 충분한 경우 | - 메모리가 제한적이거나 공간 최적화가 중요한 경우 |
문제의 크기
추적이 필요한 경우
알고리즘 최적화 목표