Ilość Kombinacji cyfr 1, 2 ,5 w liczbie 10

0

Witam, rozpocząłem nauke C# i pod koniec rodziału natknąłem się na poważny problem z rozwiązaniem 1 z 15 zadań. Akurat jest to aktulane i tracę bardzo dużo czasu na rozwikłanie problemu..
Zadanie brzmi :
Dysponując monetami 1 zł, 2 zł, 5 zł sprawdź, na ile różnych sposobów można
wypłacić 10 zł. Napisz program, który wyświetli w oknie konsoli wszystkie możliwe
kombinacje.

Rozpisałem na kartce możliwe sposoby wyszło mi ich 10.
Nie proszę o rozwiązanie lecz nakierowanie.
np.
posiadam zmienne
k = kwota do wyplaty
n = moneta
x = numer sposobu

Zastanawia mnie czy jest możliwośc wykorzystania rekurencji w taki sposób aby zmienna n się zmieniała w wartościach 5 , 2 , 1.

Dodam że to pierwszy rodział i autor chce aby zadanie zostało rozwiązane przy pomocy Pętl ( jeszcze nie było mowy o tablicach i tworzenia method ) .

4

Można to zrobić dość prosto algorytmem dynamicznym/rekurencją. Popatrz na to tak:
Możemy z tych 10zł wziąć 1zł, możemy wziąć 2zł albo 5zł, czyli mamy 3 możliwości:

  • Jeśli wybraliśmy 1zł, to zostało nam do wydania 9zł. A na ile sposobów można wydać pozostałe 9zł? :)
  • Jeśli wybraliśmy 2zł, to zostało nam do wydania 8zł. A na ile sposobów można wydać pozostałe 8zł? :)
  • Jeśli wybraliśmy 5zł, to zostało nam do wydania 5zł. A na ile sposobów można wydać pozostałe 5zł? :)

Jeśli przez f(x) oznaczymy funkcje która dla kwoty zwraca liczbę możliwości na ile można tą kwotę wybrać, to można to zapisać rekurencyjnie:
f(x) = f(x-1)+f(x-2)+f(x-5)
Warunek końca jest taki, ze jeśli mamy x==0 to zwracamy 1 (bo znaczy ze udało się wydać kwotę) a jeśli x<0 to zwracamy 0 (bo np. konfiguracja 5+2+2+2 nie jest poprawna).

To wszystko przy założeniu ze kolejność nominałów ma znaczenie, tzn [1,2] to nie to samo co [2,1]!

def f(x, buf=[]):
    if x == 0:
        print(buf) # just for debug
        return 1
    elif x < 0:
        return 0
    else:
        return f(x - 1, buf[:] + [1]) + f(x - 2, buf[:] + [2]) + f(x - 5, buf[:] + [5])


def main():
    print(f(10))


main()

(ten buf to tylko żeby móc wypisać konfiguracje)

0

Witam, na początku dziękuję bardzo za ukierunkowanie problemu i jego rozwiązania.
Niestety walczyłem jeszcze dłużą chwilę w nocy na ten temat aż w końcu się udało dojść do rozwiązania.
Tylko że musiałem to przeanalizować i napisać bez metody wiec wpakowałem wszystko w pętlach for i if.

static void Main(string[] args)
        {
            Console.WriteLine("Start");
            for(int z1 = 0; z1 <= 10; z1++)
                for(int z2 = 0; z2 <= 5; z2++)
                    for(int z5 = 0; z5 <= 2; z5++)
                        if(z1 * 1 + z2 * 2 + z5 * 5 == 10)
                            Console.WriteLine("zlotowka = {0} dwa zlote = {1} piec zlote = {2}", z1, z2, z5);
            Console.ReadKey();

        }

wynik :

zlotowka = 0 dwa zlote = 0 piec zlote = 2
zlotowka = 0 dwa zlote = 5 piec zlote = 0
zlotowka = 1 dwa zlote = 2 piec zlote = 1
zlotowka = 2 dwa zlote = 4 piec zlote = 0
zlotowka = 3 dwa zlote = 1 piec zlote = 1
zlotowka = 4 dwa zlote = 3 piec zlote = 0
zlotowka = 5 dwa zlote = 0 piec zlote = 1
zlotowka = 6 dwa zlote = 2 piec zlote = 0
zlotowka = 8 dwa zlote = 1 piec zlote = 0
zlotowka = 10 dwa zlote = 0 piec zlote = 0

Jeszcze raz dziękuje za zainteresowanie się tym postem i tak rozbudowaną wypowiedź oraz poświecenie czasu! Doceniam!

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