input: Write a function to solve a knapsack problem using dynamic programming. The function should return the maximum value that can be obtained given the weight capacity of the knapsack and the list of items with their values and weights. If the list of items is empty, the function should return 0.
  
  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(30, [10, 20, 30], [60, 100, 120], 3) == 160
  assert knapSack(50, [10, 20, 30], [0, 0, 0], 3) == 0
  assert knapSack(50, [], [], 0) == 0
output: 
  def knapSack(W, wt, val, n):
      dp = [[0 for _ in range(W + 1)] for _ in range(n + 1)]
      for i in range(n + 1):
          for w in range(W + 1):
              if i == 0 or w == 0:
                  dp[i][w] = 0
              elif 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]
  