import numpy as np M=np.loadtxt(open(0),"q") N,W=M[0];v,w=M[1:].T V=W//(U:=w[i:=np.argmax(v/w)]*1000)*v[i]*1000;W%=U dp=np.full(W+1,-10**9);dp[0]=0 R=np.arange(W+1) for v,w in M[1:]: dp-=R//w*v for i in range(w):np.maximum.accumulate(dp[i::w],out=dp[i::w]) dp+=R//w*v print(V+dp.max())