Easy to understand (with comments) Backtracking > 90% [C++]
\nclass Solution {\n    bool found;\n    vector<double> nums;\n    char ops[4] = {\'+\', \'-\', \'*\', \'/\'};\n    const double eps = 1e-9;\n    \npublic:\n   
```\nclass Solution {\n    bool found;\n    vector<double> nums;\n    char ops[4] = {\'+\', \'-\', \'*\', \'/\'};\n    const double eps = 1e-9;\n    \npublic:\n    double calc(double x, double y, char op) {\n        if (op == \'+\') return x + y;\n        else if (op == \'-\') return x - y;\n        else if (op == \'*\') return x * y;\n        else return x / y;\n    }\n    \n    vector<double> getEvaluations(int l, int r) {\n        if (found) return {}; // If an evaluation == 24 been already found, no need to continue\n        if (l == r) return {nums[l]}; // As if we put parentheses around a single number, so its evalution is the number itself\n\n        vector<double> ret;\n        // Trying all the ways we could split the current range into two subranges\n        // for example: if cards = {1,2,3,4} & l = 1, r = 3\n        // all the possible splits are: {(2), (3,4)}, {(2,3), (4)}\n        for (int i = l; i < r; i++) { \n            // get all possiple evaluations from left & right subranges \n            auto resL = getEvaluations(l, i), resR = getEvaluations(i+1, r);\n\n            // getting all possilbe evaluations by using an operation between left & right subranges\n            for (auto x : resL){\n                for (auto y : resR) {\n                    for (char op : ops) {\n                        if (op == \'/\' && y == 0) continue; // avoid dividing by 0\n                        \n                        ret.push_back(calc(x, y, op));\n                        \n                        // checking if the whole range evaluation resulted to 24\n                        // because we could get 24 in a sub range but it can\'t be an answer\n                        if (l == 0 && r == 3) found |= (abs(ret.back() - 24.0) < eps);\n                    }\n                }\n            }\n        }\n\n        return ret;\n    }\n\n    bool judgePoint24(vector<int>& cards) {\n        for (auto x : cards) nums.push_back(x * 1.0); // converting to double, for better precision\n\t\t\n        sort(nums.begin(), nums.end());\n        do {\n            found = false;\n            getEvaluations(0, 3);\n            if (found) return true;\n        } while (next_permutation(nums.begin(), nums.end()));\n\n        return false;\n    }\n};\n```
['Backtracking', 'C']