初始化状态:dp[0][0] = 0。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int N = 500; int x[N],y[N]; int dp[N][N]; int m,s; int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&m,&s); for(int i = 0; i < m; i++) { scanf("%d%d",&x[i],&y[i]); } memset(dp,INF,sizeof(dp)); dp[0][0] = 0; for(int i = 0; i < m; i++) { for(int sx = x[i]; sx <= s; sx++) { for(int sy = y[i]; sy <= s; sy++) { if(dp[sx-x[i]][sy-y[i]] != INF) { dp[sx][sy] = min(dp[sx][sy],dp[sx-x[i]][sy-y[i]]+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 && dp[i][j] != INF) { ans = min(ans,dp[i][j]); } } } if(ans == INF) { printf("not possible\n"); }else { printf("%d\n",ans); } } return 0; }