input: Write a function to find the optimal solution to solve a knapsack problem using dynamic programming. The function should return the maximum value that can be achieved given the items with their values and weights, and the capacity of the knapsack.
  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(15, [5, 2, 10, 8], [10, 15, 40, 20], 4)==35
  assert knapSack(0, [5, 2, 10, 8], [10, 15, 40, 20], 4)==0
  assert knapSack(10, [15], [10], 1)==0
output: def knapSack(W, wt, val, n):
      dp = [[0 for _ in range(W + 1)] for _ in range(n + 1)]
      for i in range(1, n + 1):
          for w in range(1, W + 1):
              if 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]