""" https://yukicoder.me/problems/no/3401 1e6までdpできるか """ N,W = map(int,input().split()) INF = float("inf") dp = [-INF] * (10**6+1) dp[0] = 0 for i in range(N): v,w = map(int,input().split()) for i in range(len(dp)-w): dp[i+w] = max(dp[i+w],dp[i] + v) for i in range(len(dp)-1): dp[i+1] = max(dp[i+1],dp[i]) ans = 0 for i in range(1,len(dp)): ans = max( ans , (W//i)*dp[i] + dp[W%i] ) print (ans)