code: def knapsack_iterative_int(items, maxweight):
      r
      values  = [t[0] for t in items]
      weights = [t[1] for t in items]
      maxsize = maxweight + 1
      dpmat = defaultdict(lambda: defaultdict(lambda: np.inf))
      kmat = defaultdict(lambda: defaultdict(lambda: False))
      idx_subset = []
      for w in range(maxsize):
          dpmat[0][w] = 0
      for idx in range(len(items)):
          item_val = values[idx]
          item_weight = weights[idx]
          for w in range(maxsize):
              valid_item = item_weight <= w
              if idx > 0:
                  prev_val = dpmat[idx - 1][w]
                  prev_noitem_val = dpmat[idx - 1][w - item_weight]
              else:
                  prev_val = 0
                  prev_noitem_val = 0
              withitem_val = item_val + prev_noitem_val
              more_valuable = withitem_val > prev_val
              if valid_item and more_valuable:
                  dpmat[idx][w] = withitem_val
                  kmat[idx][w] = True
              else:
                  dpmat[idx][w] = prev_val
                  kmat[idx][w] = False
      K = maxweight
      for idx in reversed(range(len(items))):
          if kmat[idx][K]:
              idx_subset.append(idx)
              K = K - weights[idx]
      idx_subset = sorted(idx_subset)
      items_subset = [items[i] for i in idx_subset]
      total_value = dpmat[len(items) - 1][maxweight]
      return total_value, items_subset