def knapsack(items, capacity):
    if capacity < 0 or any(weight <= 0 for weight, _ in items):
        raise ValueError('capacity must be non-negative and weights positive')
    dp = [0] * (capacity + 1)
    for weight, value in items:
        for current in range(capacity, weight - 1, -1):
            dp[current] = max(dp[current], dp[current - weight] + value)
    return dp[capacity]


if __name__ == '__main__':
    print(knapsack([(2, 4), (3, 5), (4, 7)], 5))
