The non-trivial algorithm takes $2^{n/2}$ time and memory. Divide the list into two parts and calculate all the internal sums. Sort both lists, put one pointer at the low end of one list, and another at the high end of the other list. Advance the second pointer until the sum crosses the target. Then advance the first pointer, and repeat. Maintain the "best sum encountered so far", and once the first pointer is done traversing the list, you have the optimum in your hands.
This algorithm isn't really practical, and in practice you can probably do better, potentially depending on properties of the problem. Also, there are probably nice approximation algorithms that work well in practice.