input: Write a function to calculate the maximum possible revenue from the items with given weights and values using the knapsack algorithm. The function should return the maximum value that can be obtained with a knapsack of capacity W.
  assert knapsack([2, 1, 3], [4, 2, 3], 3) == 7
  assert knapsack([1, 3, 4, 5], [1, 4, 5, 7], 4) == 9
  assert knapsack([2, 2, 3], [3, 7, 4], 3) == 10
  assert knapsack([], [], 0) == 0
  assert knapsack([1, 2, 3], [5, 3, 4], 3) == 9
output: def knapsack(weights, values, W):
      n = len(weights)
      dp = [[0] * (W + 1) for _ in range(n + 1)]
      
      for i in range(1, n + 1):
          for w in range(W + 1):
              if weights[i - 1] <= w:
                  dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1])
              else:
                  dp[i][w] = dp[i - 1][w]
      
      return dp[n][W]