输入真麻烦
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define INF -999999999
#define max 10010
int a[max],pos,n,flag,l;
char b[max];
int end;
struct node{
int d;
node* left;
node* right;
}d;
node* build(node* p,int *str,int sum)
{
pos++;
if(pos>=l)
return NULL;
if(str[pos]!=INF)
{
p=new node;
p->left=NULL;
p->right=NULL;
p->d=str[pos]+sum;
p->left=build(p,str,p->d);
p->right=build(p,str,p->d);
if(p->right==NULL&&p->left==NULL&&p->d==end)
flag=1;
return p;
}
else
return NULL;
}
int main()
{
int i,j,k,m;
char ch;
int left,right;
while(scanf("%d",&end)!=EOF)
{
memset(a,0,sizeof(a));
int n2=1,n0=0;j=0;l=0;
pos=-1;flag=0;
left=0;right=0;i=0;
while(left==0)
{
ch=getchar();
if(ch=='(')
{
left++;
b[i++]=ch;
break;
}
}
while(left!=right)
{
ch=getchar();
if(ch=='(')
left++;
if(ch==')')
right++;
if(ch=='('||ch==')'||ch=='-'||(ch>='0'&&ch<='9'))
b[i++]=ch;
}
for(i=0;n0!=n2;i++)
{
if(b[i]=='(')
{
if(b[i+1]==')')
{
n0++;
a[j++]=INF;
}
else
{
if(b[i+1]=='-')
{
int num=0;
for(k=i+2;;k++)
{
if(!isdigit(b[k]))
break;
num=num*10+b[k]-48;
}
a[j++]=-num;
i=k-1;
}
else
{
int num=0;
for(k=i+1;;k++)
{
if(!isdigit(b[k]))
break;
num=num*10+b[k]-48;
}
a[j++]=num;
i=k-1;
}
n2++;
}
}
}
l=j;
node* root=new node;
root=build(root,a,0);
if(flag)
printf("yes\n");
else if(flag==0)
printf("no\n");
}
return 0;
}
/*
22 (- 56(4(11(7()())(2()()))()) (8(13()())(4()(1()()))))
20 (5(4(11(7()())(2()()))()) (8(13()())(4()(1()()))))
*/