Problemem zmiana moneta jest bardzo dobrze udokumentowane. Biorąc pod uwagę nieskończoną dostaw nominałów monet x_1
do x_m
trzeba znaleźć liczbę kombinacji, które dodają do y
. Na przykład podane x = {1,2,3}
i y = 4
mamy 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 = 36
a n = 15
gdzie n
jest 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 enumerate
w 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
y
oznaczająca sumę każdej kombinacji. - Nieujemna liczba całkowita
n
oznaczająca całkowitą liczbę monet.
Kolejność argumentów nie ma znaczenia. Funkcje pointfree są dozwolone.
Dane wyjściowe enumerate
funkcji musi być listą kombinacji. Każda kombinacja musi być unikalna i musi być listą n
liczb 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
y
in
są zerowe, a lista nominałów jest pusty, to wyjście jest lista jednej kombinacji, pusty połączenie (tj{{}}
). - W przeciwnym razie, jeśli
y
wynosi zero,n
oznacza zero lub lista nominałów jest pusta, wówczas wynikiem jest lista zerowych kombinacji (tj{}
.). - Mówiąc bardziej ogólnie, jeśli
y
jest mniejsza niż suma nominałów lubn
jest 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 enumerate
funkcję, funkcje pomocnicze, instrukcje importu itp. Nie obejmuje przypadków testowych.
y
jest 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 n
jest mniejszy niż liczba nominałów, w końcu dojdziesz do przypadku podstawowego, gdzie n = 0
ale y != 0
. Zatem odpowiedź będzie znowu {}
.