#include<cstdio>
struct node{
int value;
struct node *lchild;
struct node *rchild;
node(int val):value(val){};
};
node* root;
void buildTree(node *&root)
{
char c;
int num=0,sign=1,isnum=0;
while(scanf("%c",&c))
{
if(c=='-')
sign=-1;
else if(c<='9' && c>='0')
{
isnum=1;
num=num*10+c-'0';
}
else if(c==')' && isnum==0)
{
root=NULL;
return;
}
else if((c==')' || c=='(') && isnum==1)
{
root=new node(num*sign);
buildTree(root->lchild);
buildTree(root->rchild);
while(scanf("%c",&c))
if(c==')') return;
}
}
}
bool findSum(node* root,int sum,int testsum)
{
bool isFound=false;
if(!root->lchild && !root->rchild && (sum+root->value==testsum))
{
isFound=true;
return isFound;
}
if(root->lchild && !isFound) isFound=findSum(root->lchild,sum+root->value,testsum);
if(root->rchild && !isFound) isFound=findSum(root->rchild,sum+root->value,testsum);
return isFound;
}
int main()
{
root=NULL;
int testsum;
while(scanf("%d",&testsum)==1)
{
getchar();
buildTree(root);
if(root)
{
bool found=findSum(root,0,testsum);
if(found)
printf("yes\n");
else
printf("no\n");
}
else
printf("no\n");
}
return 0;
}
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=48