Kezdőoldal » Számítástechnika » Programozás » Milyen algoritmussal tudom...

Milyen algoritmussal tudom meg, hogy legkevesebb hány, és milyen papírpénzzel tehető ki egy adott érték?

Figyelt kérdés

Adott egy integer ami reprezentál egy ember bankkártyáján lévő összeget. Adottak 50, 20, 10, 5 és 1 dolláros bankjegyek. Hogyan tudhatom meg, hogy legkevesebb hány bankjeggyel lehet kifizetni ezt az összeget neki? Pszeudokód vagy elindulási pontot kérnék, nem kódot, ezért nem írtam programnyelvet.


Elméletem az, hogy a legnagyobbtól kezdem, mondjuk egy while ciklusban amíg pénz-50 > 0, majd ha ebből kiugrik akkor eltárolom a maradék értéket egy változóban, majd ezután egy újabb while-al a pénz-20 > 0-t nézem stb.. a végén pedig ha pénz-5 < 0, akkor maradék * 1 dollárt adok neki. Ez működhet? Mennyire effektív?



2015. máj. 17. 16:41
 1/7 anonim ***** válasza:

pl. van a 100


akkor osszeg = 50


ha osszeg + 50 == 100, akkor állj, ha nagyobb akkor ugrik a 20-asra, ha nem akkor hozzá add még 50-et

különben osszeg + 20 == 100, akkor állj, ha nagyobb akkor ugrik a 10-esre, ha nem akkor hozzá add még 20-at-et


szerintem így kéne


remélem jól értettem a feladatott

2015. máj. 17. 16:54
Hasznos számodra ez a válasz?
 2/7 anonim ***** válasza:
a különben-et úgy értsd hogy ha nagyobb akkor ugrik egyel kisebb bankjegyre
2015. máj. 17. 16:55
Hasznos számodra ez a válasz?
 3/7 anonim ***** válasza:

int price = 1345;

int banknote[5] = {50, 20, 10, 5, 1};

int result[5];


for (int i = 0; i < 5; i++)

{

result[i] = price / banknote[i];

price -= result[i] * banknote[i];

}


Kimenet:

result 0x0030f670 {26, 2, 0, 1, 0} int[5]

2015. máj. 17. 17:41
Hasznos számodra ez a válasz?
 4/7 anonim ***** válasza:

Az a probléma a fentebb említett algoritmusokkal hogy ha nem a "standard" 50, 20, 10 ,5 ,1 bankjegyekről beszélünk, akkor nem fog működni.


Például legyen az összeg 7, a bankjegyek pedig 5,4,3,1.

Ekkor ha legnagyobbtól indulunk a legkisebb felé, 5+1+1 fog kialakulni, pedig a 4+3 egy jobb megoldás lenne.


A probléma a hátizsák probléma egy alfaja, és dinamikus programozással oldható meg a legkorrektebben, így biztosan minden esetben a minimális bankjegyszámot fogjuk megkapni.


összeg = 12345

bankjegyek[] = {50, 20, 10, 5, 1}

bankjegyek_száma[összeg] = inf //beállítjuk az összes elemét végtelenre, vagy egy nagy számra


bankjegyek_száma[0] = 0


for i = 1-től összeg-ig

. . for_each bankjegy : bankjegyek

. . . . ha bankjegy <= i

. . . . . . ha bankjegyek_száma[i - bankjegy]+1 < bankjegyek_száma[i]

. . . . . . . . bankjegyek_száma[i] := bankjegyek_száma[i - bankjegy]+1


ha bankjegyek_száma[összeg] == inf

. . a megadott bankjegyekből nem lehet kirakni az összeget!

egyébként

. . minimális bankjegyszám := bankjegyek_száma[összeg]


[link]


Ha érdekel, érdemes utánanézni a dinamikus programozás témakörének, ha nem és biztosan nincs 2 olyan pénz i és j hogy i+j>k de k>i és k>j akkor elindulsz a legnagyobbtól és addig vonod ki amíg az összeg > 0, ha az összeg = 0 akkor vége és ha az összeg < 0 akkor veszed a következő pénzt és azzal folytatod inkább.

2015. máj. 17. 18:09
Hasznos számodra ez a válasz?
 5/7 A kérdező kommentje:
Jogos a hátizsák probléma feltételezése, köszönöm, hogy megjegyezted. Megoldottam a "kevésbé hatékony" algoritmussal amit #3-as írt, neki is köszönöm szépen! Zöldek mentek.
2015. máj. 17. 20:21
 6/7 anonim ***** válasza:
Jézusom emberek, látom nagyon keményen kódoltok, de a maradékos osztást nem ismeritek?
2015. máj. 19. 22:50
Hasznos számodra ez a válasz?
 7/7 anonim ***** válasza:
#4: igaz, de mivel bankjegyről van szó, az direkt ilyen, hogy a kisebbek összegei nem adják ki a nagyobbat (vagy ha tudsz olyan pénznemet/országot, amihez hátizsák probléma kell, akkor írd)
2015. máj. 24. 01:10
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!