Bankomat dynamiczny (wydawanie reszty)

Bankomat dynamiczny (wydawanie reszty)
K3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 34
0

Cześć mam problem, pisze bankomat dynamiczny w C++ (wydawanie reszty)
Uzytkownik wpisuje w kolejnosci: kwote, n:=ilosc nominalow i n nominalow.
Program poprawnie wyswietla ile minimalnie da sie wyplacic banknotow, lecz nie wiem co zrobic by wyswietlaly sie tez te nominaly ktorych uzyto np.
dla kwoty = 13, iloscNominalow = 3, nominaly: 5,2,1 Powinien wyswietlic:
4
5 5 2 1.
Domyslam sie ze musze zrobic jakas tablice lokalna gdzie zapisuja sie te nominaly ale nie wiem jak to zrobic, pomoze ktos? Moj kod:

Kopiuj
#include <iostream>
#include <algorithm>
using namespace std;
const unsigned long INFINITY=10e6;
int main (){
int kwota,nominaly[2000],T[2000],iloscNominalow,m,ODP[100];
    cin >> kwota;
    cin >> iloscNominalow;

    for(int j=1; j<=iloscNominalow; ++j)
        cin >> nominaly[j];

    T[0]=0;

    for(int i=1; i<=kwota; ++i)
        T[i]=INFINITY;

    int index=1;

    for(int s=1; s<=iloscNominalow; ++s){
        m=nominaly[s];
        for(int b=0; b<=kwota-m; ++b){
            if(T[b]<INFINITY){
                if(T[b]+1<T[b+m]){
                    T[b+m]=T[b]+1;
                    // Tu dalej nie wiem
                }
            }
        }
    }
    if(T[kwota]==INFINITY) cout << "NIE DA SIE WYPLACIC!";
    else{
       cout << T[kwota] << endl;
       for(int i=1; i<=T[kwota]; ++i) cout << ODP[i] << " ";
        }
    return 0;
}

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Kwota: 16
Nominały: 13,8,1
Twój algorytm poda: 13,1,1,1
Zaś powinien: 8,8

K3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 34
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
3

Kod straszliwie skopany więc nie poznałem.

  • Indeksacja tablic zaczyna się od 0 nie zaś od 1
  • if(T[b]<INFINITY) { if(T[b]+1<T[b+m]) { jest tożsame z if(T[b]<INFINITY && T[b]+1<T[b+m]) {
  • INFINITY lepiej ustaw na kwota+1 bo jak ktoś zażyci sobie wydanie 2000000 zaś nominały to tylko 1 to klapa
  • Nie jestem pewien czy to zadziała poprawnie w każdym przypadku, oryginalny algorytm mówi że dla każdej kwoty sprawdzamy ... , czyli inna kolejność pętli.
Kopiuj
                    T[b+m]=T[b]+1;
                    Q[b+m]=m; // Q jak Quote

Ostatni banknot: b1=Q[kwota];
Przedostatni banknot: b2=Q[kwota-b1];
Kolejny banknot: b3=Q[kwota-b1-b2];

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.