Problemem zmiana moneta jest bardzo dobrze udokumentowane. Biorąc pod uwagę nieskończoną dostaw nominałów monet x_1do x_mtrzeba znaleźć liczbę kombinacji, które dodają do y. Na przykład podane x = {1,2,3}i y = 4mamy cztery kombinacje:
{1,1,1,1}{1,1,2}{1,3}{2,2}
Wprowadzenie
Istnieje kilka odmian problemu zmiany monety. W tej odmianie mamy dwa dodatkowe ograniczenia:
- Każdy nominał musi być użyty co najmniej raz.
- W sumie należy użyć dokładnie określonej liczby monet.
Na przykład, biorąc pod uwagę x = {1,2,3}, y = 36a n = 15gdzie njest to łączna liczba monet, które muszą być stosowane, otrzymujemy cztery kombinacje:
{1,2,2,2,2,2,2,2,3,3,3,3,3,3,3}(1 jedynki, 7 dwójek, 7 trójek){1,1,2,2,2,2,2,3,3,3,3,3,3,3,3}(2 jedynki, 5 dwójek, 8 trójek){1,1,1,2,2,2,3,3,3,3,3,3,3,3,3}(3 jedynki, 3 dwójki, 9 trójek){1,1,1,1,2,3,3,3,3,3,3,3,3,3,3}(4 jedynki, 1 dwójka, 10 trójek)
Wyzwanie
Wyzwanie polega na napisaniu funkcji enumeratew wybranym języku, która wylicza wszystkie kombinacje zgodnie z powyższym opisem:
- Lista nominałów. Na przykład
{1,5,10,25}. Możesz użyć list lub tablic. - Nieujemna liczba całkowita
yoznaczająca sumę każdej kombinacji. - Nieujemna liczba całkowita
noznaczająca całkowitą liczbę monet.
Kolejność argumentów nie ma znaczenia. Funkcje pointfree są dozwolone.
Dane wyjściowe enumeratefunkcji musi być listą kombinacji. Każda kombinacja musi być unikalna i musi być listą nliczb całkowitych, które się sumują y. Każdy nominał musi pojawić się co najmniej raz w każdej kombinacji i nie może zabraknąć żadnej kombinacji. Kolejność liczb całkowitych i kombinacji nie ma znaczenia. Do danych wyjściowych można użyć list lub tablic.
Należy pamiętać o następujących przypadkach krawędzi:
- Jeśli oba
yinsą zerowe, a lista nominałów jest pusty, to wyjście jest lista jednej kombinacji, pusty połączenie (tj{{}}). - W przeciwnym razie, jeśli
ywynosi zero,noznacza zero lub lista nominałów jest pusta, wówczas wynikiem jest lista zerowych kombinacji (tj{}.). - Mówiąc bardziej ogólnie, jeśli
yjest mniejsza niż suma nominałów lubnjest mniejsza niż liczba nominałów, wówczas wynikiem jest lista zerowych kombinacji.
Punktacja będzie oparta na wielkości całego programu w bajtach. Pamiętaj, że obejmuje to enumeratefunkcję, funkcje pomocnicze, instrukcje importu itp. Nie obejmuje przypadków testowych.
yjest mniejsza niż suma nominałów, to w pewnym momencie rozwiązania rekurencyjnego dojdziesz do przypadku podstawowego, w którym lista nominałów jest pusta. Dlatego odpowiedź będzie {}(tzn. Nie znaleziono rozwiązania). Jeśli njest mniejszy niż liczba nominałów, w końcu dojdziesz do przypadku podstawowego, gdzie n = 0ale y != 0. Zatem odpowiedź będzie znowu {}.