Item = Struct.new(:w, :v)

n, w = gets.split.map(&:to_i)
$items = n.times.map {Item[*gets.split.map(&:to_i)]}

$memo = {}
def dp(n, w)
	return 0 if n == 0
	item = $items[n-1]
	$memo[w*101+n] ||= [
		dp(n-1, w),
		(item.w <= w) ? dp(n-1, w-item.w) + item.v : 0,
	].max
end

p dp(n, w)
