input: Write a function to implement a dynamic programming solution for the 0-1 knapsack problem. The function should take the capacity of the knapsack, weights of the items, values of the items, and the number of items as input and return the maximum value that can be obtained.
  
  def knapSack(W, wt, val, n):
      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], 3) == 220
  assert knapSack(35, [5, 10, 15], [10, 30, 20], 3) == 40
  assert knapSack(25, [10, 15, 20], [50, 30, 100], 3) == 150
  assert knapSack(45, [15, 20, 25], [50, 100, 10], 3) == 150
  assert knapSack(0, [10, 20, 30], [60, 100, 120], 3) == 0
  assert knapSack(50, [], [], 0) == 0
output: def knapSack(W, wt, val, n):
      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]