fbpx

Problema #3170 – Plata3 – Rezolvari PBInfo

de Mihai-Alexandru

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.

#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

S-ar putea sa iti placa