Klasyczny przykład na rekurencję z powrotami.
Jesli kwota == 0 to wypisujesz rozwiązanie.
Na każdym poziomie masz pętlę po możliwych nominałach. Dodajesz nominał do aktualnego rozwiązania a następnie rekurencyjnie wywołujesz funkcje z aktualnych rozwiązaniem i nową (mniejszą) kwotą to rozmienienia. Następnie to samo z kolejnym nominałem.
Może sie nigdzie nie machnąłem, ale głowy nie daje. A nominały radzę podawać posortowane wartościami :P
#include <iostream>
#include <vector>
using namespace std;
void rozmiany(vector<int>& nominaly, vector<int>& rozwiazanie, int kwota, int poprzedni);
int main()
{
vector<int> nominaly;
vector<int> rozwiazanie;
int n,kwota,nominal;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>nominal;
nominaly.push_back(nominal);
}
cin>>kwota;
rozmiany(nominaly,rozwiazanie,kwota,0);
return 0;
}
void wypisz(vector<int>& rozwiazanie)
{
for(unsigned i=0; i<rozwiazanie.size(); i++)
cout<<rozwiazanie[i]<<" ";
cout<<endl;
}
void rozmiany(vector<int>& nominaly, vector<int>& rozwiazanie, int kwota, int poprzedni)
{
if(kwota<0)
return;
else if(kwota == 0)
{
wypisz(rozwiazanie);
}
else
{
for(unsigned i=0; i<nominaly.size(); i++)
{
if(poprzedni<=nominaly[i])
{
rozwiazanie.push_back(nominaly[i]);
kwota-=nominaly[i];
rozmiany(nominaly,rozwiazanie,kwota,nominaly[i]);
rozwiazanie.pop_back();
kwota+=nominaly[i];
}
}
}
}
Podajesz: ilośc nominałów nominały kwota
Przykład użycia:
3
5 2 1
20