# PBinfo #3170 – Plata3 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerința
Se consideră n tipuri de bancnote, cu valorile v[1] v[2] ... v[n], ordonate strict crescător. Se cere să se determine o modalitate de a plăti integral o sumă dată S cu bancnotele disponibile, știind că se pot folosi oricâte bancnote de orice tip.

Date de intrare
Programul citește de la tastatură numerele n și S, apoi valorile  v[1] v[2] ... v[n] ale bancnotelor.

Date de ieșire
Programul va afișa pe ecran n numere, reprezentând o modalitate de plată a sumei S. Fiecare număr x[i] va reprezenta numărul de bancnote de valoarea x[i] folosite pentru plata sumei S.

Restricții și precizări

1 ≤ n ≤ 6
1 ≤ S ≤ 1000
1 ≤ v[i] ≤ 100
oricare variantă corectă de plată a sumei S va fi luată în considerare
pentru toate seturile de date există soluție

Exemplu:
Intrare

5 375
1 5 10 50 100
Ieșire

5 2 1 1 3 
Observații
Există și alte soluții valide.

## Cod sursă C++

```cpp
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
ofstream fout("output.txt");
int n , S, v[10], x[10], gasit = false;
void Afis(int k, ostream & out)
{
	gasit = true;
	for(int i = 1 ; i <= k ; i ++)
		out << x[i] << " ";
	out << "\n";
}
void back(int k, int sum)
{
	if(k <= n)
		for(int i = 0 ; i <= (S - sum) / v[k] && !gasit ; i ++)
		{
			x[k] = i;
			if(sum + x[k] * v[k] == S)
				Afis(n, cout);
			else
				back(k + 1 , sum + x[k] * v[k]);
		}
}
int main()
{
	cin >> n >> S;
	for(int i = 1 ; i <= n ; ++i)
		cin >> v[i];
	back(1, 0);
	return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3170)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3170/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3170/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
