Checking if three numbers sum to a given number
This is a specialised instance of the Subset sum problem, which is NP-Complete in the general case. 

Of course, when working with a small subset size that is known in advance, we can significantly cut down on the running time (at worst checking C{n, k} values, where n is the number of values in the search space and k is the size of the subset we're looking for).  The O(n^3) naive algorithm here is clearly much better than the O(n!) running time of your original algorithm. However, we can get this down to O(n^2 log n) pretty easily. Firstly, sort the original array:

private int[] values;

public Subset(int[] v)
{
    values = Arrays.copyOf(v, v.length);
    Arrays.sort(values);
}


Now, we can loop over each pair of indices in the array, and binary search for the difference between the calculated sum and the desired number:

public boolean sumsTo(int num)
{
    int sum = 0;
    for(int i = 0; i &lt; values.length - 1; ++i) { 
        for(int j = i+1;  j &lt; values.length; ++j) {
            sum = values[i] + values[j];
            if(Arrays.binarySearch(values, num - sum) &gt; 0) {
                return true;
            }
        }
    }

    return false;
}


In fact, with a bit more stuffing around, we can get this down to O(n^2). There is an approach to do so outlined here.