Эта проблема эквивалентна проблеме смены монет - получить сумму с ограниченным числом (здесь не более 29) монет с некоторыми номиналами (здесь 1,2,3,4)
Самый простой способвнести все изменения - это рекурсивная генерация.
makesum(coinlist, currentsum, resultlist)
if currensum < 0
return
if currensum = 0
print resultlist
for coin in coinlist
makesum(coinlist - coin, currentsum - coinvalue, resultlist + coin)
Для конкретного случая - небольшой фиксированный список номиналов - вы можете просто сделать 4 вложенных цикла
Также существует подход динамического программирования - заполнить таблицу [0..сумма] с возможными комбинациями (для получения всех возможных комбинаций DP не быстрее)