//DFS回溯,其实就是24点游戏的问题 //没想到那么蛋疼,居然卡了我很久,显然的深搜题 //回溯思路是这样的,5个数,先任意找2个数进行加减乘除,把这2个数运算后的结果当做一个数,按相同的方法搜下去 //把4个数任取2个然后合并成3个,再继续搜下去 //搜索树的深度为5, 第一层最多有C(2,5)*5种分支,这里5表示两个数做运算最多能产生5种结果 //第二层C(2,4)*5...显然搜索树规模挺小的,加上除法这一运算产生的几率更小,因此这样搜过去必然没问题 //我WA了很久的一个原因是初始化,没有把ANS初始化为-INF是最大的失败.. #include<iostream> #include<cstdio> #include<algorithm> using namespace std; bool ok; int T; long A[5],target,ans; long add(long x,long y) { return x + y; } long sub(long x,long y) { return x - y; } long mul(long x,long y) { return x * y; } long Div(long x,long y) { if(x < y) swap(x,y); if(y == 0 || x % y != 0) return -1; return x / y; } void dfs(long N[],int size) { if(ok) return; if(N[0] <= target && N[0] > ans) { ans = N[0]; if(ans == target) { ok = 1; return; } } if(size == 1) return; long num[5]; for(int i = 0;i < size;++i) { for(int j = i+1;j < size;++j) { for(int k = 0,h = 1;k < size;++k) if(k != i && k != j) num[h++] = N[k];//填补除去选中的I,J两个数 num[0] = add(N[i],N[j]); dfs(num,size-1); num[0] = sub(N[i],N[j]); dfs(num,size-1); num[0] = -num[0]; dfs(num,size-1);//减法有可以交换 num[0] = mul(N[i],N[j]); dfs(num,size-1); num[0] = Div(N[i],N[j]); if(num[0] != -1) dfs(num,size-1); } } } int main() { //freopen("in.txt","r",stdin); scanf("%d",&T); while(T--) { ok = 0; for(int i = 0;i < 5;++i) scanf("%ld",&A[i]); scanf("%ld",&target); ans = -2000000000; for(int i = 0;i < 5;++i) if(A[i] <= target && A[i] > ans) ans = A[i]; dfs(A,5); printf("%ld/n",ans); } }