This is not a complete answer, nor optimal, nor from a specialist. But I would like to explain what I think could be a reasonably good approach. Note that it is a constructive approach, still in the style "try out many combinations", just more efficient than a random approach. I do not know whether there is an approach that just gives you a fast yes/no answer without telling you the actual combinations.
1) Order the pieces by weight. I assume that they are all 3.1 oz or less and that you cannot cut them into smaller pieces.
2) Look for 3.1 oz pieces and put them aside (or into a sandwich).
3) Look at the biggest piece left and look for complementary pieces (of weight 3.1-x), starting from the bottom of the ordered list, and going up only until the sum is still smaller or equal than 3.1 oz. If you find a complementary piece, put them both aside. Do the same for all other pieces (of course, if you have many pieces with the same weight, you can skip the remaining ones as soon as you have a failed attempt), always starting the check for the complementary piece from the obvious place in the list (i.e.: start to look for complementary pieces from the same place in the list where you found the last successful match: smaller pieces won't do).
4) Then start again from the first piece and look for fillings with three pieces. If you have stored the information about the available sums of weights of pairs of pieces in the previous round, without repetition (but with a link to the actual pairs), and filtered out the pairs were some pieces have already been put to the side, you might be able to exploit this information to be faster: you are again looking at pairs of data, not at triples!
5) Do it again and again, always increasing the number of pieces you consider, but always comparing only the weights of single pieces with the available sums of $n-1$ weights smaller than 3.1 oz (which you have stored in the previous round)
How do you know when to stop? Well, naively, you cannot use more than 31 pieces for a sandwich. But, more efficiently, when at the beginning of a round you start comparing the biggest piece left with the smallest sum of $n-1$ weights, you can stop if the total sum is bigger than 3.1 oz.
Sorry if the explanation is not very clear. I can write down an example, if you want. Again, this is a naive way to optimize, based on ordering (so as not to check things many times) and storing data (for the same reason). I am not claiming that this is optimal, but it might be a relatively good solution. It should be doable by hand and if you know some programming and have a laptop at work, you can probably use this algorithm to get all the combinations explicitly computed in a couple of seconds.
Remark: I think that it can be shown that this greedy approach actually gives you the highest number of doable sandwiches, because at the end you are left only with small pieces, and you could not do anything meaningful with them anyway, even if they were combined into bigger pieces of the same total mass.