540
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 ≤ 61 ≤ S ≤ 10001 ≤ v[i] ≤ 100- oricare variantă corectă de plată a sumei
Sva 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.
#include <bits/stdc++.h>
using namespace std;
int n , x[1001] , v[1001] , ok , s;
void afisare()
{
for(int i = 1 ; i <= n ; i++)
cout << x[i] << " ";
ok = 1;
}
void back(int k , int sp)
{
for(int i = 0 ; i <= (s - sp) / v[k] && !ok ; i++)
{
x[k] = i;
sp += x[k] * v[k];
if(sp <= s)
if(k == n)
{
if(sp == s) afisare();
}
else back(k + 1 , sp);
sp -= x[k] * v[k];
}
}
int main()
{
cin >> n >> s;
for(int i = 1 ; i <= n ; i++)
cin >> v[i];
back(1 , 0);
}
Comentarii