#include<stdio.h>
int main()
{
int t,n,m,i,j;
long long c[2005],w[2005],f[50005];//c数组代表体积,w数组代表价值,用来表示背包的体积的数组
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%lld%lld",&c[i],&w[i]);
}//数组的输入
for(i=1;i<=m;i++)
f[i]=-2000000000000;//f数组初始化(根据不同需要可以有不同的初始化)
f[0]=0;
for(i=0;i<n;i++)//枚举n个物品
{
for(j=c[i];j<=m;j++)//从第i个物品的体积开始dp后面的背包的容量,一直到容量为m
{
if(f[j]<f[j-c[i]]+w[i])
{
f[j]=f[j-c[i]]+w[i];
}
}
}
if(f[m]<0)
printf("NO\n");
else
printf("%lld\n",f[m]);
}
return 0;
}
int main()
{
int t,n,m,i,j;
long long c[2005],w[2005],f[50005];//c数组代表体积,w数组代表价值,用来表示背包的体积的数组
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%lld%lld",&c[i],&w[i]);
}//数组的输入
for(i=1;i<=m;i++)
f[i]=-2000000000000;//f数组初始化(根据不同需要可以有不同的初始化)
f[0]=0;
for(i=0;i<n;i++)//枚举n个物品
{
for(j=c[i];j<=m;j++)//从第i个物品的体积开始dp后面的背包的容量,一直到容量为m
{
if(f[j]<f[j-c[i]]+w[i])
{
f[j]=f[j-c[i]]+w[i];
}
}
}
if(f[m]<0)
printf("NO\n");
else
printf("%lld\n",f[m]);
}
return 0;
}