input: Write a function to solve the knapsack problem using dynamic programming. The function should take the items with their values and weights, and the capacity of the knapsack as inputs. It should return the maximum value that can be obtained by selecting items without exceeding the knapsack's capacity.
  
  def knapSack(W, wt, val, n):
      if n == 0 or W == 0:
          return 0
      if wt[n-1] > W:
          return knapSack(W, wt, val, n-1)
      else:
          return max(val[n-1] + knapSack(W-wt[n-1], wt, val, n-1), knapSack(W, wt, val, n-1))
  
  assert knapSack(50, [10, 20, 30], [60, 100, 120], 3) == 220
  assert knapSack(60, [10, 20, 30], [60, 100, 120], 3) == 280
  assert knapSack(40, [10, 20, 30], [60, 100, 120], 3) == 160
  assert knapSack(70, [10, 20, 30], [60, 100, 120], 3) == 280
  assert knapSack(0, [10, 20, 30], [60, 100, 120], 3) == 0
output: 
  def knapSack(W, wt, val, n):
      dp = [[0 for _ in range(W + 1)] for _ in range(n + 1)]
      for i in range(1, n + 1):
          for w in range(1, W + 1):
              if wt[i-1] <= w:
                  dp[i][w] = max(val[i-1] + dp[i-1][w-wt[i-1]], dp[i-1][w])
              else:
                  dp[i][w] = dp[i-1][w]
      return dp[n][W]
  