input: Write a function to find the optimal solution to solve a knapsack problem using dynamic programming. The function should take the capacity of the knapsack, a list of item values, and a list of item weights as input. It should return the maximum value that can be obtained by selecting items without exceeding the knapsack's capacity. If the input lists are empty, the function should return 0.
  def knapSack(W, wt, val):
      n = len(val)
      if n == 0 or W == 0:
          return 0
  
      dp = [[0 for x in range(W + 1)] for x 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]
  
  assert knapSack(50, [10, 20, 30], [60, 100, 120])==220
  assert knapSack(4, [1, 1, 1, 1], [2, 3, 4, 5])==14
  assert knapSack(7, [2, 3, 4], [4, 5, 6])==9
  assert knapSack(0, [10, 20, 30], [60, 100, 120])==0
  assert knapSack(50, [], [])==0
output: def knapSack(W, wt, val):
      n = len(val)
      if n == 0 or W == 0:
          return 0
  
      dp = [[0 for x in range(W + 1)] for x 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]