input: Write a function to solve a knapsack problem using dynamic programming. The function should take as input the capacity of the knapsack, a list of item weights, and a list of item values. It should return the maximum value that can be attained with the given capacity constraint. If the input lists are empty, 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(10, [5, 4, 6, 3], [10, 40, 30, 50], 4) == 90
  assert knapSack(7, [1, 3, 4, 5], [1, 4, 5, 7], 4) == 9
  assert knapSack(3, [], [], 0) == 0
  assert knapSack(50, [10, 20], [60, 100], 2) == 160
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]