题意:e-coin有两个价值x,y,现在给你一个价值n,给你几种e-coin,问你能否用最小的e-coin数得到所求的价值n*n=(x1+x2+...xn)^2+(y1+y2+...yn)^2。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=505;
struct node
{
int x,y;
}coin[50];
int map[N][N];
bool vis[N][N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
memset(map,0x7f,sizeof(map));
int n,m,ans=1<<30;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d%d",&coin[i].x,&coin[i].y);
vis[0][0]=1;map[0][0]=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
for(int k=0;k<m;k++)
{
int xx=j+coin[i].x,yy=k+coin[i].y;
if(vis[j][k]&&map[xx][yy]>map[j][k]+1&&xx<=m&&yy<=m)
{
vis[xx][yy]=1;
map[xx][yy]=map[j][k]+1;
if(xx*xx+yy*yy==m*m)
{
ans=min(ans,map[xx][yy]);
}
}
}
}
}
if(ans!=1<<30) printf("%d\n",ans);
else puts("not possible");
}
return 0;
}