Problem:
式

与えられた 4 つの 1 から 9 の整数を使って、答えが 10 になる式をつくります。
4 つの整数 a, b, c, d を入力したとき、下記の条件に従い、答えが 10 になる式を出力するプログラムを作成してください。また、答えが複数ある時は、最初に見つかった答えだけを出力するものとします。答えがない時は、0 と出力してください。

演算子として、加算 (+)、減算 (-)、乗算 (*) だけを使います。除算 (/) は使いません。使用できる演算子は３個です。

数を4つとも使わなければいけません。

4つの数の順番は自由に入れ換えてかまいません。

カッコを使ってもかまいません。使用できるカッコは３組（６個）以下です。

Input

複数のデータセットが与えられます。各データセットの形式は以下のとおり：

a b c d

入力は４つの 0 で終了します。データセットの数は 40 を超えません。

Output

各データセットについて、与えられた 4 つの整数と上記の演算記号およびカッコを組み合わせて値が 10 となる式または 0 を１行に出力してください。式の文字列が 1024 文字を超えてはいけません。

Sample Input

8 7 9 9
4 4 4 4
5 5 7 5
0 0 0 0

Output for the Sample Input

((9 * (9 - 7)) - 8)
0
((7 * 5) - (5 * 5))

Solution in C++11 (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
#define REP(i,n) for(int i=0; i<(int)(n); ++i)

using namespace std;

const int N = 4;
const int MAX_E = 100;
const char ope[] = {'+', '-', '*'};

bool is_end(vector<int> a) {
    REP(i, a.size()) if(a[i] != 0) return false;
    return true;
}

int calc(int type, int val, int x) {
    if(type == 0) return val - x;
    if(type == 1) return x - val;
    if(type == 2) return val / x;
}

bool used[5][5][300];
string memo[5][5][300];
string rec(const vector<int>& nums, int l, int r, int val) {
    if(used[l][r][val + MAX_E]) return memo[l][r][val + MAX_E];
    used[l][r][val + MAX_E] = true;
    string& res = memo[l][r][val + MAX_E];

    if(r - l == 1) {
        if(nums[l] == val) {
            return res = to_string(val);
        } else {
            return res = "";
        }
    }

    for(int k = 1; l + k < r; k++) {
        for(int x = -MAX_E; x <= MAX_E; x++) {
            for(int type = 0; type < 3; type++) {
                if(type == 2 && (x == 0 || val % x != 0)) continue;
                int y = calc(type, val, x);
                string ls = rec(nums, l, l + k, x);
                string rs = rec(nums, l + k, r, y);
                if(ls == "") continue;
                if(rs == "") continue;
                if(nums.size() == 4)
                return res = "(" + ls + ope[type] + rs + ")";
            }
        }
    }

    return res = "";
}

int main(){
    while(true) {
        vector<int> nums(N);
        REP(i, N) cin >> nums[i];
        if(is_end(nums)) break;

        bool exist = false;
        do{
            memset(used, 0, sizeof(used));
            string s = rec(nums, 0, nums.size(), 10);
            if(s != "") {
                cout << s << endl;
                exist = true;
                break;
            }
        }while(next_permutation(nums.begin(), nums.end()));

        if(!exist) {
            cout << "0" << endl;
        }
    }
    return 0;
}