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... #include <iostream>
using namespace std;
int main() { int max = 100000; int tablica_kwot[ max - 1 ]; int nominaly[] = { 300, 200, 1 }; 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; }
|
|
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 |
|
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? |
|
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 |
|
mateczek |
» 2016-11-29 18:08:32 #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 ]; if( ileRazy ) { sumator += ileRazy * nominaly[ index ]; cout << ileRazy << " * " << nominaly[ index ] << endl; kwota = kwota - ileRazy * nominaly[ index ]; } else { index++; } } } |
|
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. |
|
« 1 » |