HackerRank: Electronics Shop
early pruning
This is very nice:
        // delete any that are over our budget

Doing it before sorting can slightly speed the sorting operation.
I say slightly because &quot;items over budget&quot; is determined by the input,
and it will be some fraction f of an input item category,
so the savings is O(f * n * log n).
early discard
This is a bigger deal.
        // sort the list &amp; delete anything over budget

For k keyboards and d drives, the sort does O(k * d * log k * d) work.
Discarding within this loop would be an even bigger win.
consistent idiom
It was a little odd that you used
        combinedTotals.RemoveAll(n =&gt; n &gt; budget);

and
        array.Where(n =&gt; n &lt; budget).ToArray();

to accomplish the same thing.
There's no speed difference but consider phrasing the same thing in the same way.
reversing
If you pass into Sort something that implements the IComparer interface,
you can change the comparison order and thus skip the Reverse step entirely.
arithmetic
Arbitrarily choose one of the categories as the driving category, perhaps keyboard.
Sort the drive prices, while leaving the keyboards in arbitrary order.
Note the min drive price, and use that along with budget for immediately pruning infeasible keyboards.
Loop over all surviving keyboards.
Target price is budget - kb_price.
Do binary search over drives for the target,
finding largest feasible drive,
and use that to update &quot;best combo so far&quot;.
No need to sort them, you need only retain the &quot;best&quot; one.