Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit

Ahoj, mám takový problém nevím jak vyřešit následující úkol :
Jsme v zemi, ve které se používají mince v hodnotě 1, 15, 18 a 49. Vytvořte program, který
dostane jako parametr (či v souboru) přirozené číslo a jako výstup dá číslo, kolik nejméně
potřebujeme mincí k zaplacení dané částky.
Pozor: uvědomte si, že hladový algoritmus fungující u nás (s mincemi 1,2,5,10,20,50) jdoucí
od nejvyšší hodnoty mince "dokud to jde", není v této zemi správný!
Například: částku 103 byste tímto algoritmem zaplatili jako 49+49+1+1+1+1+1 (7mincí), ale
správné řešení je 49+18+18+18 (4mince)
Více bodů dostanete, zobecníte-li program a hodnoty mincí v oné zemi budete načítat z
textového souboru.
Více bodů dostanete za efektivnější (rychleji počítající) algoritmus. Částka kterou chcete
rozdělit může být v řádech milionů.
Test pro hodnoty mincí 1,15,18,49:
Vstup (částka) Výstup (nejmenší počet mincí k zaplacení)
30 => 2
103 => 4
202 => 7
987 => 24
10000 => 208
14010 => 296
140103 => 2863
9531602 => 194526
Předem děkuji.
Jelena: upřesnění, že nejde o aktuální soutěž:
Offline

↑ brnopcman:
Nevim co by byl efektivni algoritmus. Ale muj napad by byl nasledujici. Pokial
je pocet druhov minci a
su hodnoty roznych minci. Potom nech
je optimalna pocet minci pre cislo n.
oznacuje pocet minci
v tejto kombinaci. A teda plati 
Potom plati rekurzia
.
Teda cislo n vieme poskladat optimalne takym sposobom, ze pridame 1 mincu
k nejakej optimalnej kombinacii
. Zakladom rekurzie bude
. Teraz ide o to ako najlepsie naprogramovat vypocet tejto rekurzie. Nenapada ma zatial lepsi sposob ako pocitat to od jednotky pre vsetky cisla az po n. Zaznamenavat si hodnoty a kombinacie pre vsetky cisla n. A postupne z nich vypocitavat najlepsiu kombinaciu az po n. Ked uz to mam, tak mam vsetky kombinacie pre hodnoty
takze dalsi vypocet nastane az ked natrafime na cislo ktore je ostre vacsie ako n.
Mozno je ale aj rychlejsi zposob ale nic ma nenapada.
Offline
Napadlo mě postupovat metodou podobnou Eratosthenovu sítu. Ale při zde uvedeném případu čísla "14010 => 296" jsem se zaseknul, protože mi program našel lepší řešení: 14010=>285*49+3*15, tj potřebuji jen 288 mincí. 8-O Asi za to může ta flaška vína tak mě prosím nekamenujte.... :-)))
Offline
Tak jsem premohl kocovinu ;-) a splodil (možná už pozdě) prográmek v Python co to řeší jinak než pomocí síta. Pokud je zájem, je ke stažení na
http://ulozto.cz/x87yX56z/uloha05-pro-matforum-py-zip
a potvrzuji že 14010 se da složit z 288 minci.
Offline