UVA-112

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <cctype>
#include <algorithm>
// #define DEBUG //可注释
#ifndef DEBUG
#include <fstream>
#define cout __f
std::ofstream __f("E:/out.txt",std::ios::out);
#endif
using namespace std;
int n;
string s;
char p[1000];
bool f(int s1,int s2,int x){
    //到达叶子才可以判断,左右子树都是空才是叶子
    if(s.substr(s1,s2-s1)=="()") return false;
    //可能不仅仅是一位数
    int j;
    for(j=s1+1;isdigit(s[j])||s[j]=='-'||s[j]=='+';j++);
    int p=atoi(s.substr(s1+1,j-s1-1).c_str()),num=0,i;
    if(s.substr(j,s2-j-1)=="()()"){
        if(x+p==n) return true;
        else return false;
    }
    for(i=j;i<s2;i++){
        if(s[i]=='(') num++;
        else if(s[i]==')') num--;
        if(num==0) break;
    }
    if(!f(j,i+1,x+p)&&!f(i+1,s2-1,x+p)) return false;
    else return true;
}
int main(){
    char c;
    int num=0;
    while (cin>>n)
    {
        num=0;
        s.clear();
        do
        {
            cin>>c;
            if(c=='(') num++;
            else if(c==')') num--;
            s.push_back(c);
        }while (num!=0);
        if(f(0,s.length(),0)) cout<<"yes
";
        else cout<<"no
";
    }
    return 0;
}
原文地址:https://www.cnblogs.com/MorrowWind/p/13056521.html