Muszę iść do banku i wypłacić trochę pieniędzy. Muszę wypłacić 30 USD, 22 USD, aby zapłacić współlokatorowi za Internet i 8 USD za pranie. Ponieważ żadna z nich nie może zmienić, potrzebuję 30 USD na podzielenie na dwie partie dwóch rozmiarów. Oznacza to, że kiedy kasjer zapyta mnie, jak chcę moje 30 USD, będę musiał złożyć wniosek. Mogę im powiedzieć, że chcę za dwadzieścia, piątkę i pięć. Ale chcę, aby moja prośba była jak najprostsza, aby uniknąć konieczności powtarzania się. Aby uprościć moją prośbę, mógłbym poprosić o to, aby moja gotówka zawierała dwadzieścia i co najmniej 2, ponieważ 8 wynika z sumy, ale jeszcze lepiej mogę po prostu poprosić, aby jeden z rachunków, który otrzymam, był rachunkiem za jeden dolar (jeśli nie są do tego przekonani, po prostu spróbuj zarobić 29 dolarów bez zarabiania 8).
Więc to wszystko w porządku i elegancko, ale muszę przeprowadzać te obliczenia za każdym razem, gdy idę do banku, więc pomyślałem, że napiszę program, który to zrobi (czy napiszesz program, który to dla mnie zrobi).
Twój program lub funkcja powinna wziąć listę liczb całkowitych reprezentujących wszystkie płatności, które muszę dokonać, oraz zestaw liczb całkowitych reprezentujących nominały rachunków dostępnych w banku, i musisz podać najmniejszą listę nominałów, tak aby każdy sposób na sumę obejmuje to, że listę nominałów można jednoznacznie podzielić na listę płatności.
Dodatkowe zasady
Możesz założyć, że lista nominałów zawsze będzie zawierać a
1
lub możesz dodać ją do każdej listy samodzielnie.Niektóre dane wejściowe będą miały wiele minimalnych rozwiązań. W takich przypadkach możesz wypisać jedno z nich.
To jest golf golfowy, więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.
Przypadki testowe
Payments, denominations -> requests
{22,8} {1,2,5,10,20,50} -> {1} or {2}
{2,1,2} {1,5} -> {1}
{20,10} {1,2,5,10,20,50} -> {}
{1,1,1,1} {1,2} -> {1,1,1}
{20,6} {1,4,5} -> {1}
{2,6} {1,2,7} -> {2}
{22, 11} {1, 3, 30, 50} -> {1, 3}
{44, 22} {1, 3, 30, 50} -> {1, 3, 3, 30}
{2,6} {1,2,7} -> {2}
.(If you are not convinced of this just try to make 29 dollars without making 9)
Masz na myśli bez robienia 8? I nie rozumieją lub nieOdpowiedzi:
JavaScript (ES6),
485476 bajtówW porządku ... to potwór. :-(
Ale to dość szybki potwór, który prawie natychmiast rozwiązuje wszystkie przypadki testowe.
Mogę później spróbować bardziej zaawansowanego golfa, ale spędziłem już o wiele za dużo czasu.
Przypadki testowe
Pokaż fragment kodu
W jaki sposób?
Uwaga: To nie jest już zgodne z bieżącą wersją, ale jest o wiele łatwiejsze do odczytania w ten sposób.
źródło
&&
do&
i||
do|
?a || b
ocenib
tylko jeślia
jest fałszem, podczas gdya | b
bezwarunkowo wykona bitową operację OR pomiędzya
ib
.Python 2 ,
456455 bajtówNiezwykle, bardzo, bardzo wolno !!!! Powinien działać poprawnie na wszystkich przykładowych danych wejściowych, mając wystarczająco dużo czasu
Edycja: Zapisano 1 bajt dzięki @Jonathan Frech
Wypróbuj online!
Wyjaśnienie
źródło
input()
jest jeden bajt krótszy .