package algorithm; import java.util.Arrays; public class Knapsack { static final int MAX_N = 100; static int[][] dp = new int[MAX_N][MAX_N]; static int W; static int[] v; static int[] w; static int n; public static void main(String[] args) { n = 4; w = new int[] {2, 1, 3, 2}; v = new int[] {3, 2, 4, 2}; W = 5; // Arrays.fill(dp, -1); error! for (int[] row : dp) Arrays.fill(row, -1); // int res = solve(0,W); // System.out.println(res); solve2(); } private static int solve(int idx, int weight) { if (dp[idx][weight] >= 0) { return dp[idx][weight]; } int res; if (idx == n) { res = 0; } else if ( weight < w[idx]) { // skip res = solve(idx+1, weight); } else { // 넣는 경우, 넣지 않는 경우. int a = solve(idx + 1, weight); int b = solve(idx + 1, weight - w[idx]) + v[idx]; // 이 경우에만 물건을 넣는 경우 v[idx]로 이때만 추가된다. res = Math.max(a, b); } return dp[idx][weight] = res; } private static void solve2() { // i=idx, j=weight for (int[] row : dp) Arrays.fill(row, 0); // -1이 아님을 주의. 캐시를 하는 것이 아니라. 전부 더할 것이다. for (int i = n - 1; i >= 0; i--) { for (int j = 0; j <= W; j++) { if (j < w[i]) { dp[i][j] = dp[i + 1][j]; } else { dp[i][j] = Math.max(dp[i + 1][j], dp[i + 1][j - w[i]] + v[i]); } } } for (int i = 0; i <= W; i++) { for (int j = 0; j <= W; j++) { System.out.print(dp[i][j] + " "); } System.out.println(); } System.out.println(dp[0][W]); } }
2018년 7월 14일 토요일
동적설계법 배낭문제 - 2
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기