Cerința
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
Exemplu
Intrare
5 375 1 5 10 50 100 6 3 4 6 1
Ieșire
5 2 1 5 1
Explicație
Se folosesc cinci bancnote de 1
leu, două de 5
lei, una de 10
lei, cinci de 50
de lei și una de 100
de lei: 5 * 1 + 2 * 10 + 5 * 50 + 1 * 100 = 375
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Plata2:
#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;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #3169 Plata2
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3169 Plata2 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!