Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Algorytm dynamiczny wydawania reszty, wypisywanie nominałów

Ostatnio zmodyfikowano 2016-11-29 18:53
Autor Wiadomość
Wedge
Temat założony przez niniejszego użytkownika
Algorytm dynamiczny wydawania reszty, wypisywanie nominałów
» 2016-11-29 05:53:18
Witam. Mam algorytm wydawania reszty napisany sposobem dynamicznym, tylko potrzebuje by oprócz wypisania ilości użytych nominałów wypisało mi jakie nominały zostały użyte, czy da się to tutaj zrobić w prosty sposób, moja wiedza z programowania dynamicznego kuleje...

C/C++
#include <iostream>

using namespace std;

int main()
{
    int max = 100000;
    int tablica_kwot[ max - 1 ];
    int nominaly[] = { 300, 200, 1 }; // nominały mogą się zmienic, to tylko przykład
    int ilosc_nominalow = 3;
    int kwota;
    cout << "Kwota: ";
    cin >> kwota;
    for( int i = 1; i <= kwota; i++ )
    {
        tablica_kwot[ i ] = max;
    }
    tablica_kwot[ 0 ] = 0;
    for( int i = 0; i < ilosc_nominalow; i++ )
    {
        for( int j = 0; j < kwota; j++ )
        if( tablica_kwot[ j ] != max )
        {
            int wartosc = j + nominaly[ i ];
            int rozmiar = tablica_kwot[ j ] + 1;
            if(( wartosc <= kwota ) &&( rozmiar < tablica_kwot[ wartosc ] ) )
            {
                tablica_kwot[ wartosc ] = rozmiar;
            }
        }
    }
    if( tablica_kwot[ kwota ] == max ) cout << "NIEMOZLIWE";
    else cout << tablica_kwot[ kwota ] << endl;
   
}
P-154249
Anim
» 2016-11-29 12:58:36
Dopisz funkcję wyliczającą wszelkie kombinacje z powtórzeniami :) jeżeli suma kombinacji będzie równała się założonej kwocie, to znalazłeś swoje rozwiązanie ^^, np.

dla przykładu z wikipedii - kwotę 13 złotych przy użyciu nominałów 5,2,1 można wydać w 4 nominałach. Kombinacje 4-elementowe:

(5,5,5,5), (2,2,2,2), .... , (5,2,2,1), (5,5,2,1) <= suma == 13, a więc Twoje rozwiązanie
P-154254
Wedge
Temat założony przez niniejszego użytkownika
» 2016-11-29 14:32:45
Dobry pomysł, ale wydłuży mi to działanie programu przy większej ilości nominałów za bardzo, a implementacja tego też nie jest dla mnie prosta i nie mam czasu by jeszcze to dodać, nie da się tego wyczytać w jakiś prostszy sposób nie wymagający pisania kolejnego algorytmu?
P-154269
Anim
» 2016-11-29 14:56:57
Z tego co przejrzałem ten algorytm reszty, to chyba nie ma możliwości wyznaczenia "od ręki" konkretnych nominałów. Może jestem w błędzie. Ale prawie jestem pewien, że i tak trzeba dopisać jeszcze fragment kodu - najszybciej według mnie implementuje się tę kombinację z powtórzeniami. Ja bym tak zrobił. Może ktoś inny ma odmienny ogląd i pomysł :D
P-154273
mateczek
» 2016-11-29 18:08:32
C/C++
#include <iostream>

using namespace std;

int main()
{
    int nominaly[] = { 200, 100, 50, 20, 10, 5, 2, 1 }; //
    int kwota = 1222;
    int kw = kwota;
    int sumator = 0, index = 0;
    while( sumator != kw ) {
        int ileRazy = kwota / nominaly[ index ]; // ile maxymalnych nominałów się zmieści
        if( ileRazy ) { // jeśli wynik ile >0;
            sumator += ileRazy * nominaly[ index ]; //aktualnie zsumowana reszta
            cout << ileRazy << " * " << nominaly[ index ] << endl;
            kwota = kwota - ileRazy * nominaly[ index ]; //kwota pomniejszona o sumator. reszta do dalszego rozbicia na nominały
        } else {
            index++; //zmienia nominał na niższy
        }
    }
}
P-154283
Wedge
Temat założony przez niniejszego użytkownika
» 2016-11-29 18:53:54
Dzięki (i tak miałem napisać te metodę też xD), ale nie o to chodzi z moim problemem, to co podałeś jest sposobem zachłannym, działa tylko dla szczególnych zbiorów nominałów, a ja potrzebuje by to działało dla wszystkich. Np. Dla 550, 200, 1 i kwoty 600 chce by dało 3x200, a twój daje 1x550 50x1.
P-154284
« 1 »
  Strona 1 z 1