10400 - Game Show Math------水题
来源:互联网 发布:华为机顶盒装软件 编辑:程序博客网 时间:2024/06/14 08:00
#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<cstring>#include <algorithm>#define N 105#define MIN 1e-11#define M 32010#define MM 70000using namespace std;int a[N];int s[N];int v[N][MM];//MM粗心忘了,wa!!!int t,goal,n;char map[5]= {'+','+','-','*','/'};int flag;int dfs(int k,int cur){ if(k==n) { if(cur==goal) { printf("%d",a[0]); for(int i=1; i<n; i++) { printf("%c%d",map[s[i]],a[i]); } printf("=%d\n",goal); flag=0; return 1; } return 0; } int temp=cur+a[k]; if(temp<=M&&!v[k][temp+M])//&&temp>=-M { v[k][temp+M]=1; s[k]=1; if(dfs(k+1,temp)) return 1; } temp=cur-a[k]; if(temp>=-M&&!v[k][temp+M])//temp<=M&& { v[k][temp+M]=1; s[k]=2; if(dfs(k+1,temp)) return 1; } temp=cur*a[k]; if(temp<=M&&temp>=-M&&!v[k][temp+M]) { v[k][temp+M]=1; s[k]=3; if(dfs(k+1,temp)) return 1; } if(a[k]&&!(cur%a[k]))// { temp=cur/a[k]; if(temp<=M&&temp>=-M&&!v[k][temp+M])////// { v[k][temp+M]=1; s[k]=4; if(dfs(k+1,temp)) return 1; } } return 0;}int main(){#ifndef ONLINE_JUDGE freopen("ex.in","r",stdin);#endif scanf("%d",&t); while(t--) { memset(v,0,sizeof(v)); flag=1; scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d",&a[i]); scanf("%d",&goal); dfs(1,a[0]); if(flag) printf("NO EXPRESSION\n"); } return 0;}