Приветствую!
Попробовал решить Вашу задачку, и вот результат в виде
кода на Qt.
Предлагаю решать её так:
1. С полной уверенностью находим баланс для транзакций.
2. Удаляем все совпадения из баланса (записывая транзакцию в ответ) и все объекты с нулевым балансом.
3. Находим самый маленький по модулю баланс.
4. А сейчас начинается милая сердцу рекурсия: для каждого из баланса другого знака создаём и проводим транзакцию. И запускаем эту же функцию с новыми значениями баланса.
5. Если получившийся результат в пункте 4 самый короткий по числу транзакций — радостно сохраняем его и передаём наверх.
Естественно пугаюсь того что рекурсия будет очень прожорливой.