I would use shared variables (big surprise, I say it just about every post). Running totals might work, but I like variables.
Since you are basically only displaying the subtotal when grouping by {paycode}, in the group header I would set the variable to 0, in the detail section I would add to the reserve the values that are reserves and likewise for the payments, and in the group footer, I would have a formula to calculate the difference and one to report the payments. Sounds simple. For this to work as well, it would seem that you would need to do a full outer join on the payment and the reserve tables based on paycode, and in the formula to increment, you would only increment if the value is not null (means that a match could not be found in the other table). If there are always more or the same number of reserves than payments, a left join to reserves of payments would work instead of the full join.
if you were getting this from stored proc, you could have your data engine do all this work for you, instead of crystal and then you might not need the subreport or all these formulas.
HTH