Matematické Fórum

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

#1 19. 04. 2013 14:09 — Editoval jelena (19. 04. 2013 14:51)

brnopcman
Zelenáč
Místo: Brno
Příspěvky: 3
Škola: Gymnázium Vídeňská 47
Pozice: student
Reputace:   
Web
 

Mince

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

 

#2 19. 04. 2013 14:30 Příspěvek uživatele jelena byl skryt uživatelem jelena. Důvod: upřesnění, zda aktuální soutěž - v pořádku

#3 19. 04. 2013 14:35 — Editoval brnopcman (19. 04. 2013 14:45) Příspěvek uživatele brnopcman byl skryt uživatelem jelena. Důvod: upřesnění, zda aktuální soutěž - v pořádku

#4 19. 04. 2013 14:48 Příspěvek uživatele jelena byl skryt uživatelem jelena. Důvod: upřesnění, zda aktuální soutěž - v pořádku

#5 19. 04. 2013 15:17 — Editoval JohnPeca18 (19. 04. 2013 15:17)

JohnPeca18
Příspěvky: 651
Škola: MFF UK
Pozice: Absolvent 2014
Reputace:   81 
 

Re: Mince

↑ brnopcman:
Nevim co by byl efektivni algoritmus. Ale muj napad by byl nasledujici. Pokial $k$ je pocet druhov minci a $m_1, \dots, m_k$ su hodnoty roznych minci. Potom nech$H(n)=\sum_{i=1}^{k}H_i(n)$ je optimalna pocet minci pre cislo n. $H_i(n)$ oznacuje pocet minci $m_i$ v tejto kombinaci. A teda plati $\sum_{i=1}^{k}m_iH_i(n)=n$
Potom plati rekurzia $H(n)=1+\min_{i\in \{1,\dots, k\}}{H(n-m_i)}$.
Teda cislo n vieme poskladat optimalne takym sposobom, ze pridame 1 mincu $m_i$ k nejakej optimalnej kombinacii $H(n-m_i)$. Zakladom rekurzie bude $H(0)=0$. 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 $\leq n$ 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

 

#6 19. 04. 2013 20:04

Wrunx
Příspěvky: 65
Reputace:   
 

Re: Mince

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

 

#7 20. 04. 2013 21:30

Wrunx
Příspěvky: 65
Reputace:   
 

Re: Mince

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

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson