#include<iostream> #include<stdio.h> using namespace std; //感觉这样的搜索不容易组织代码啊!!! int number[5]; int goal; int result; bool dfs(int n) { if(n==1) {//剩下最后一个数字时为基条件· if(number[0]==goal){ result = goal; return true;//满足结果则退出 } else if(number[0]<goal&&number[0]>result) result = number[0];//更新最接近的 return false; } for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ int a = number[i]; int b = number[j]; //没一次运算减少一个数字 number[j]=number[n-1];//将最后一个数字移至[j],结果存入[i] //回忆起了求全部排列的递归算法 if(number[i]==goal){result=goal;return true;} else if(number[i]<goal&&number[i]>result) { result=number[i]; }//搜索空运算 number[i]=a+b; if(number[i]==goal){result=number[i];return true;} else if(number[i]<goal&&number[i]>result) result=number[i]; //不满足则继续 if(dfs(n-1)) return true; number[i]=a-b; if(number[i]==goal){result=number[i];return true;} else if(number[i]<goal&&number[i]>result) result=number[i]; if(dfs(n-1)) return true; number[i]=b-a; if(number[i]==goal){result=number[i];return true;} else if(number[i]<goal&&number[i]>result) result=number[i]; if(dfs(n-1)) return true; number[i]=a*b; if(number[i]==goal){result=number[i];return true;} else if(number[i]<goal&&number[i]>result) result=number[i]; if(dfs(n-1)) return true; if(b!=0&&a%b==0){ number[i]=a/b; if(number[i]==goal){result=number[i];return true;} else if(number[i]<goal&&number[i]>result) result=number[i]; if(dfs(n-1)) return true; } if(a!=0&&b%a==0){ number[i]=b/a; if(number[i]==goal){result=number[i];return true;} else if(number[i]<goal&&number[i]>result) result=number[i]; if(dfs(n-1)) return true; } number[i]=a;//若ab不满足,恢复,更换顺序继续搜索 number[j]=b; } } return false;//全部满足则退出,result保存了最接近的 } int main() { int N; scanf("%d",&N); while(N--){ for(int i=0;i<5;i++) scanf("%d",number+i); scanf("%d",&goal); result=-99999999; dfs(5); printf("%d/n",result); } }