input: Write a function to find the optimal solution to a knapsack problem using dynamic programming. The function should take in a list of items, where each item is represented as a tuple containing its value and weight, and the capacity of the knapsack. The function should return the maximum value that can be obtained by selecting items without exceeding the knapsack's capacity. If the input list is empty or the knapsack's capacity is zero, the function should return 0.
  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(0, [10, 20, 30], [60, 100, 120], 3) == 0
  assert knapSack(50, [], [], 0) == 0
  assert knapSack(3, [4], [5], 1) == 0
  assert knapSack(3, [1, 1, 1], [1, 2, 3], 3) == 6
output: def knapSack(capacity, weights, values, n):
      if n == 0 or capacity == 0:
          return 0
      
      dp = [[0 for _ in range(capacity + 1)] for _ in range(n + 1)]
      
      for i in range(1, n + 1):
          for w in range(1, capacity + 1):
              if weights[i-1] <= w:
                  dp[i][w] = max(values[i-1] + dp[i-1][w-weights[i-1]], dp[i-1][w])
              else:
                  dp[i][w] = dp[i-1][w]
      
      return dp[n][capacity]