#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define inf 0x3f3f3f3f using namespace std; int dp[350][350]; int info[50]; int con[50]; int m,s; // 递归解 int solve(int x,int y){ if(dp[x][y]!=-1) return dp[x][y]; int minx = inf; for(int i=1 ; i<=m ; i++){ if(x-con[i]>=0 &&y-info[i]>=0){ int tem = solve(x-con[i],y-info[i]); dp[x-con[i]][y-info[i]] = tem; if(tem+1<minx) minx = tem+1; } } return dp[x][y] = minx; } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d",&m,&s); for(int i=1 ; i<=m ; i++){ scanf("%d%d",&con[i],&info[i]); } for(int i=0 ; i<=s ; i++){ for(int j=0 ; j<=s ; j++){ dp[i][j] = inf; } } dp[0][0] = 0; 将递归转化为递推式 for(int i=0 ; i<=s ; i++){ for(int j=0 ; j<=s ; j++){ for(int k=1 ; k<=m ; k++){ if(i-con[k]>=0&&j-info[k]>=0) dp[i][j] = min(dp[i][j],dp[i-con[k]][j-info[k]]+1); } } } int mins = inf; for(int i=0 ; i<=s ; i++){ for(int j=0 ; j<=s ; j++){ if(i*i+j*j==s*s && dp[i][j]<mins) mins = dp[i][j]; } } if(mins == inf) printf("not possible\n"); else printf("%d\n",mins); } return 0; }