Se consideră n
tipuri de bancnote, cu valorile v[1] v[2] ... v[n]
, ordonate strict crescător. Pentru fiecare tip de bancnote se știe numărul de bancnote disponibile c[1] c[2] ... c[n]
. Se cere să se determine o modalitate de a plăti integral o sumă dată S
cu bancnotele disponibile, astfel încât să se folosească cel puțin o bancnotă de fiecare tip.
Date de intrare
Programul citește de la tastatură numerele n
și S
, apoi valorile v[1] v[2] ... v[n]
ale bancnotelor și apoi c[1] c[2] ... c[n]
.
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
1 ≤ c[i] ≤ 10
- oricare variantă corectă de plată a sumei
S
va fi luată în considerare - pentru toate seturile de date există soluție
#include <iostream> #include <fstream> #include <iomanip> using namespace std; ofstream fout("output.txt"); int n , S, v[10], x[10], c[100], gasit = false; void Afis(int k, ostream & out) { gasit = true; for(int i = 1 ; i <= k ; i ++) out << x[i] << " "; out << " "; } void back(int k, int sum) { if(k <= n) for(int i = 1 ; i <= min((S - sum) / v[k], c[k]) && !gasit ; i ++) { x[k] = i; if(sum + x[k] * v[k] == S) Afis(k, 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]; for(int i = 1 ; i <= n ; ++i) cin >> c[i]; back(1, 0); return 0; }