C++, kombinatoryka - trudne zadanie

0

Witam serdecznie, potrzebuję napisać program z którym zupełnie sobie nie radze. Program ten ma wyświetlić wszystkie rodzaje (możliwości) rozmieniania 100 zł (w banknotach: 50, 20, 10 oraz monetach: 5, 2, 1)
np.

  1. 100
  2. 50, 50
  3. 50, 20, 20, 10
  4. 50, 20, 20, 10, 5, 5
  5. 50, 20, 20, 10, 5, 2, 2, 1
  6. 50, 20, 20, 10, 5, 2, 1, 1, 1
    . ...
    . ...
    . ...
    n. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ...
    Próbowałem różnych metod i naprawdę nie jestem w stanie tego napisać samodzielnie.
    Bardzo proszę o pomoc i z góry dziękuję.
    Pzdr.
0

Klasyczny przykład na rekurencję z powrotami.
Jesli kwota == 0 to wypisujesz rozwiązanie.
Na każdym poziomie masz pętlę po możliwych nominałach. Dodajesz nominał do aktualnego rozwiązania a następnie rekurencyjnie wywołujesz funkcje z aktualnych rozwiązaniem i nową (mniejszą) kwotą to rozmienienia. Następnie to samo z kolejnym nominałem.
Może sie nigdzie nie machnąłem, ale głowy nie daje. A nominały radzę podawać posortowane wartościami :P

#include <iostream>
#include <vector>
using namespace std;

void rozmiany(vector<int>& nominaly, vector<int>& rozwiazanie, int kwota, int poprzedni);

int main()
{
    vector<int> nominaly;
    vector<int> rozwiazanie;
    int n,kwota,nominal;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>nominal;
        nominaly.push_back(nominal);
    }
    cin>>kwota;
    rozmiany(nominaly,rozwiazanie,kwota,0);
    return 0;
}

void wypisz(vector<int>& rozwiazanie)
{
    for(unsigned i=0; i<rozwiazanie.size(); i++)
        cout<<rozwiazanie[i]<<" ";
    cout<<endl;
}

void rozmiany(vector<int>& nominaly, vector<int>& rozwiazanie, int kwota, int poprzedni)
{
    if(kwota<0)
        return;
    else if(kwota == 0)
    {
        wypisz(rozwiazanie);
    }
    else
    {
        for(unsigned i=0; i<nominaly.size(); i++)
        {
            if(poprzedni<=nominaly[i])
            {
                rozwiazanie.push_back(nominaly[i]);
                kwota-=nominaly[i];
                rozmiany(nominaly,rozwiazanie,kwota,nominaly[i]);
                rozwiazanie.pop_back();
                kwota+=nominaly[i];
            }
        }
    }
}

Podajesz: ilośc nominałów nominały kwota
Przykład użycia:
3
5 2 1
20

0

Dzięki za pomoc, jednak niestety niewiele mi to wyjaśnia. na chwilę obecną uczę się programować, znam tylko pętle, wskaźniki i podstawowe tablice... większość osób mowi, że to banalne z wykorzystaniem wektorów, jednak dla mnie to czarna magia.

0

To zamiast wektora napisz własną listę jednokierunkową. Wyjdzie na to samo.

0

Może to zabrzmi dość dziecinnie albo leniwie ale ja naprawdę nie mam pojęcia jak to zrobić. Szukałem informacji o liście i z tego co wyczytałem to i tak nie wiele rozumiem, mam bardzo mało czasu by to zrobić. Muszę to wysłać wykładowcy zaraz po nowym roku i od tego programu zależy moje zaliczenie... od kilku dni próbuję to napisać przy pomocy tablic, pętli i wskaźników ale niestety to mnie przerasta. Wydaje mi się, że programowanie nie sprawia ci wiele trudności i jesteś w tym bardzo dobry (w końcu od ręki znalazłeś rozwiązanie na mój problem). Dlatego prosiłbym Cię, byś był na tyle łaskawy i napisał dla mnie ten program o ile to nie byłby żaden problem dla Ciebie.

0

o_O? Przecież właśnie ci go napisałem. Kod który wstawiłem powyżej to nie jest żaden "znaleziony kod" a zwyczajnie napisany od ręki. Powinieneś to docenić, bo bardzo rzadko mam na tyle dobry humor żeby podać kompletne rozwiązanie za darmo. Jest koniec grudnia. To znaczy ze uczysz sie C++ przynajmniej przez 3 miesiące. Czyżby imprezki były ważniejsze od nauki? To masz teraz problem. Czego ty wlaściwie jeszcze chcesz? Żeby przepisać to na wersję "łatwiejszą"? o_O Spoko, za 100zl mogę się zastanowić...

0

Pisząc, że znalazłeś rozwiązanie miałem na myśli to, że sam doszedłeś do rozwiązania własnoręcznie w ciągu paru chwil. Sam nie potrafię dojść do napisania tego kodu ale dla tego, że w ciągu dnia pracuje a pod wieczór większość czasu zajmuje się dzieckiem a nie dlatego, że imprezuje.

0

Poza tym dzięki, że w ogóle odpisałeś i pomogłeś

0

Aha, przepraszam cię! Nie sprawdziłem do końca tego co mi napisałeś! Faktycznie działa i to idealnie, o to mi chodziło! jeszcze raz wielkie dzięki i przepraszam za kłopot!

1 użytkowników online, w tym zalogowanych: 0, gości: 1