Это очень похоже на общий вопрос программирования: «Сколько способов вы можете объединить Y типов монет с Z значениями, чтобы получить X долларов», то есть внести изменения в X долларов с Y типами монет.
Вот общее решение, которое можно перенести на C ++:
I = list of items SORTED from highest to lowest price
N = number of items bought so far
M = money left
S = money to start
function shop(I, N, M, S):
if M < 0: return 0 //we bought something illegally!
if M == 0:
//If we have no money, we've bought all we could.
//Check our condition that num items N = starting money S
return 1 if N == S, else 0
if I is empty:
return 0 //no more item combos, no way to buy things.
else:
newI = I with first element removed
//Every time we want to buy stuff, we have two options:
//1. buy something of highest value and subtract money
//2. Shop ignoring the next highest value item
return shop(newI, N, M, S) + shop(I, N+1, M-(cost of first item), S)
С X долларами вы начинаете с вызова:
shop(I, 0, X, X)