input: Write a function to solve the 0-1 Knapsack problem using a dynamic programming approach given a list of items with their values and weights, and the capacity of the knapsack. If the item is included in the solution, add its value to the total and decrease the capacity by the item's weight. Return the maximum value that can be obtained.
  def knapSack(W, wt, val, n): 
    
      # Base Case 
      if n == 0 or W == 0: 
          return 0
    
      # If weight of the nth item is more 
      # than Knapsack capacity W, then 
      # this item cannot be included in the optimal solution 
      if (wt[n-1] > W): 
          return knapSack(W, wt, val, n-1) 
    
      # return the maximum of two cases: 
      # (1) nth item included 
      # (2) not included 
      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(40, [10, 20, 30], [60, 100, 120], 3) == 160
  assert knapSack(0, [10, 20, 30], [60, 100, 120], 3) == 0
  assert knapSack(50, [], [], 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]