The challenge can be formulated using Xpress as a Mixed Integer Programming (MIP) problem. Solving the MIP formulation to completion would yield an optimal solution. However, due to the size of the data, and complexity of the problem, such a formulation is not expected to be directly practical.
We provide you a simple example formulation using a standard assignment approach as a Mosel model. This formulation works for a problem with 20-50 gifts (depending on your hardware).
To extend from the basic Mosel model, a possible approach to overcome the size limitation is either to aggregate or to cluster the gifts. We provide you a clustering second Mosel model, which uses R to create clusters of sizes that are more appropriate for the MIP formulation. Once the clusters are created, this model executes the simple MIP formulation in parallel and collects up the results to a single submission file.
More details on the Xpress R integration can be found here.