Fill a small 0/1 knapsack table where each row decides whether one more item is available.

Algorithm

@steps

  1. Create a table with one extra row for using zero items.
  2. Process the four items in fixed order.
  3. For each capacity, inherit when the item is too heavy.
  4. Otherwise compare skip and take from the previous row.
  5. Print the best value and the full deterministic table. @end @complexity
  • Time: O(item_count * capacity)
  • Space: O(item_count * capacity) @end
state transition `dp[i][w]` compares skipping item `i` with taking it and reading the remaining capacity from the previous row.

Java DSA Implementation

Basic.java
public class Basic {
  static String rowString(int[] row) {
    StringBuilder out = new StringBuilder("[");
    for (int i = 0; i < row.length; i++) {
      if (i > 0) out.append(", ");
      out.append(row[i]);
    }
    return out.append("]").toString();
  }
  static String tableString(int[][] table) {
    StringBuilder out = new StringBuilder("[");
    for (int i = 0; i < table.length; i++) {
      if (i > 0) out.append(", ");
      out.append(rowString(table[i]));
    }
    return out.append("]").toString();
  }
  public static void main(String[] args) {
    int[] weights = {2, 3, 4, 5};
    int[] values = {3, 4, 5, 6};
    int capacity = 5;
    int[][] dp = new int[weights.length + 1][capacity + 1];
    for (int item = 1; item <= weights.length; item++) {
      int weight = weights[item - 1];
      int value = values[item - 1];
      for (int cap = 0; cap <= capacity; cap++) {
        if (weight > cap) dp[item][cap] = dp[item - 1][cap];
        else {
          int skip = dp[item - 1][cap];
          int take = value + dp[item - 1][cap - weight];
          dp[item][cap] = Math.max(skip, take);
        }
      }
    }
    System.out.println(dp[weights.length][capacity]);
    System.out.println(tableString(dp));
  }
}

@end @output 7 [[0, 0, 0, 0, 0, 0], [0, 0, 3, 3, 3, 3], [0, 0, 3, 4, 4, 7], [0, 0, 3, 4, 5, 7], [0, 0, 3, 4, 5, 7]] @end