dp已经够暴力了,不要怕去暴力
#include<stdio.h>
#include<string.h>
#define MAXN 305
#define INF 0x7ffffff
int dp[MAXN][MAXN];
struct node
{
int x,y;
}coins[45];
int min(int a,int b) {return a<b?a:b;}
int main()
{
int cas;
int n,s;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&n,&s);
for(int i=0;i<n;i++)
scanf("%d%d",&coins[i].x,&coins[i].y);
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<n;i++)
for(int x=coins[i].x;x<=s;x++)
for(int y=coins[i].y;y<=s;y++)
dp[x][y]=min(dp[x][y],dp[x-coins[i].x][y-coins[i].y]+1);
int ans=INF;
for(int i=0;i<=s;i++)
for(int j=0;j<=s;j++)
if(i*i+j*j==s*s)
ans=min(ans,dp[i][j]);
if(ans==INF) printf("not possible\n");
else printf("%d\n",ans);
}
return 0;
}