Aufteilungsproblem
Übersicht

![]() |
JeanBetreff: Aufteilungsproblem |
![]() Antworten mit Zitat ![]() |
---|---|---|
Guten Abend
Ich habe ein kleines Problem: Und zwar geht es darum, eine Anzahl Münzen mit einem unterschiedlichen Wert an 2 Spieler zu verteilen, so dass die beiden Spieler am Ende je einen möglichst unterschiedlosen Wert erhalten. Jedoch wird es fast immer ein Unterschied geben. Es ist mir dabei egal, ob beide Spieler gleich viele Münzen erhalten, wichtig ist das der Gesamtwert möglichst gleich ist. Hier habe ich mal die nachgestellte Situation: Code: [AUSKLAPPEN] anzahl_muenzen = 8
Dim muenzen(anzahl_muenzen) For i=1 To anzahl_muenzen muenzen(i) = Rand (1,99) Next Ich erwarte nicht, dass mir jemand einen Code schreibt, sondern ich möchte, dass mir jemand eine Lösungsidee vorgibt. VIelen Dank |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Um das Problem lösen zu können muss man noch wissen welche Wertverhältnisse die münzen zueinander haben.
Mein Vorgehen wäre: Für jede Münzart die Summe des Wertes ermitteln (größere Münzen werden mal des Wertes im Vergleich zur kleinsten genommen). (Die Summe dieser Einzelwerte ergibt die Gesamtsumme. Diese wird durch 2 geteilt.) - dient nur der Überprüfung am Ende. Nun wird, beginnend mit der größten Münzart, jedem Spieler die Hälfte jedes Münzhaufens zugeteilt. Wenn es eine grade Zahl ist, super. Wenn nicht wird die überschüssige Münze einem Spieler gegeben und der andere erhält dafür von der nächst kleineren Art sofort soviele Münzen wie es braucht um eine große zu erhalten. Sollte das nicht gehen erhält er alle kleineren und dann von der nächstkleineren Sorte und so fort, bis ein Ausgleich geschaffen ist. Danach wiederholt sich das Spiel ab der größten Münzart die noch Münzen hat. |
||
- Zuletzt bearbeitet von BladeRunner am Sa, Nov 18, 2006 20:53, insgesamt einmal bearbeitet
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, du errechnest den Gesamtwert. Sagen wir aml alle Münzen zusammen sind 10 Dollar wert. Dann teilst du das Ergebnis durch 2 und rundest nach unten ab. Nun verteilst du so viele Münzen an einen, bis dieser gerundete Wert erreicht ist(Bei den Kleinsten Münzen anfangen, damit es Möglichst genau wird. Am besten du sortierst sie vorher nach Grösse). Der andere Spieler bekommt dann eben die übrigen Münzen. | ||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
Jean |
![]() Antworten mit Zitat ![]() |
---|---|---|
@BladeRunner: Deine Idee könnte (oder wird) funktionieren. Ich probiere es mal aus.
@Blitzcoder: Deine Idee würde funktionieren, ist aber sehr ungenau. Es geht mir darum den kleinsten möglichen Unterschied zu berechnen. Aber tortzdem eine gute Idee. An beide ein grosses DANKE! |
||
c64 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] Dim Beutel (10,100) ; 10 Beutel mit der Kapazität von 100 Münzen Function fill_Beutel (BTL,MAX_Muenzen,MAX_WERT) ; BEUTEL ; MAXIMALE MÜNZEN MAXIMALER WERT SeedRnd ( MilliSecs () ) ; ZUFALLSMUSTER SETZEN SeedRnd ( Rnd ( MilliSecs() ) ) ; MIT GESETZTEM ZUFALL NEUES ZUFALLSMUSTER SETZEN While wert_in <> Max_wert And cnt < 20 ; schleife solange count oder Wert <> als Max wert ist For c = 1 To Max_muenzen ; ALten Beutelinhalt löschen Beutel (BTL,c)= 0 Next Wert_in = 0 ; wert in auf 9 mnze = 1 ; mnze steht für Münze als Münzcounter >>> BEUTEL (BEUTEL , MÜNZE ) While Wert_in < Max_wert And mnze < max_muenzen ;Zählt münzen in den Beutel Wert = Rand(1,15) ; hier wird der wert derMünze festgelegt Beutel (BTL,mnze) = WERT ; hier wird die Münze reingepackt als Münze MNZE Wert_in=wert_in + Wert ; der wert der sich imBeutel befindet wird erhöht mit dem Münzwert Mnze = mnze +1 ; der Münzcounter wird erhöht Wend Cnt=cnt+1 ; der Counter wird hochgesetzt Wend Return Wert_in ; wert wird zurückgegeben der sich imBeutel befindet um evtl. die Rountine zu wiederholen End Function ;ein TESTLAUF !! Print fill_beutel (2,90,500) Print fill_beutel (3,50,230) Print fill_beutel (4,50,240) Print fill_beutel (5,50,220) Print fill_beutel (6,50,200) Print fill_beutel (7,50,190) Print fill_beutel (8,50,180) WaitKey mfg c64 |
||
- Zuletzt bearbeitet von c64 am So, Nov 19, 2006 0:48, insgesamt 3-mal bearbeitet
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm, zum einen seh ich nicht wirklich den Sinn des Codes. Eine Erläuterung wäre eventuell sinnvoll.
Zum anderen: Du initialisierst den Zufallsgenerator mit Millisecs, um ihn dann erneut zu initialisieren- mittels eines Zufallswertes der anhand des Seeds fest ist. Das ist doppelt gemoppelt, kannst Du dir sparen, denn zufälliger als zufällig werden die Ergebnisse nicht. Der Algo ist ja derselbe, und welchen Einsprungspunkt Du hast weisst Du ja schon wegen des wahren Zufallsfaktors (Millisecs()) nicht. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
c64 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zum zufall , www.blitzbase.de/befehle2d/rndseed.htm , das mag zwar doppelt gemoppelt sein dennoch ist es nicht sinnlos. (EDIT: wobei obs so wirklich was bringt hmm naja egal schlimm ist es auch nicht ![]() Zum Code hmm, naja eigentlich solltest du schon in der lage sein den zu verstehen aber ich werde ihn ausdokumentieren. Und der Sinn liegt darin das man verschiedenen Geldbeuteln münzen zufügen kann, man kann den Beutel angeben die maximale Anzahl an Münzen und den wert der sich im Geldbeutel befinden darf. Wird der wert überschritten wird es einfach nochmal versucht bis der Counter zu hoch ist dann wird automatisch beendet aber der wert sollte nur geringfügig anders sein als der Maximalwert. mfg C64 |
||
Betreten verboten! Kinder haften für ihre Eltern! |
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
c64 hat Folgendes geschrieben: Zum zufall , www.blitzbase.de/befehle2d/rndseed.htm , das mag zwar doppelt gemoppelt sein dennoch ist es nicht sinnlos.
doch ![]() Code: [AUSKLAPPEN] SeedRnd ( MilliSecs () ) ; ZUFALLSMUSTER SETZEN
SeedRnd ( Rnd ( MilliSecs() ) ) ; MIT GESETZTEM ZUFALL NEUES ZUFALLSMUSTER SETZEN der erste befehl erzeugt ein zufallsmuster, indem er millisecs() als basis zur erzeugung des musters nimmt. der zweite befehl erzeugt ein zufallsmuster, indem er rnd(millisecs) als basis zur erzeugung des musters nimmt, und ignoriert damit den ersten befehl ![]() zusätzlich hat der erste befehl immer eine andere basis zur verfügung, da millisecs() die zeit seit dem rechnerstart ist der zweite befehl hingegen kann 2 oder mehrere male dieselbe basis erhalten, da rnd(millisecs()) 2 oder mehrere male den gleichen wert haben kann! l8er, psy |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm, da sollte die OnlineHilfe vielleicht mal angepasst werden.
Was deinen Code angeht, ich hatte nicht nach einer Auskommentierung gefragt. Mir blieb der Sinn unklar, denn was Du hier machst hat nichts mit der Fragestellung zu tun. Er wollte ja nicht wissen wie er Beutel befüllt sondern wie er befüllte Beutel aufteilt. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
c64 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] "Und zwar geht es darum, eine Anzahl Münzen mit einem unterschiedlichen Wert an 2 Spieler zu verteilen" Naja wie auch immer ..... *zusammenreiss [edit] Ahso Naja ok eine festgelegte Anzahl an Münzen, würde aber auch mit diesem Code gehen !! ![]() Code: [AUSKLAPPEN] Münzen = Rand (500,1000) ;Anzahl der Gesammten Münzen MAx_wert_je_Player = Rand (500,1000) ;Münzwert den Spieler haben darf Münzen_je_player = Münzen / PLAYERS ; Könnte man auch noch auf einen gesamtwert umstellen fill_beutel (xx,Münzen_je_player,Max_wert_je_player) [/Edit] |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Seufz.
Er meint den Fall: Gefunden werden 3 Gold, 20 Silber und 27 Bronzemünzen. Gold ist 100 Bronze wert, Silber ist 10 Bronze wert. Daher Gesamtwert hier: 300 +200+27 = 527 Bronze. Nun soll das auf 2 Spieler aufgeteilt werden: Spieler 1 erhält 2 Gold (200) + 6 Silber (60) + 3 Bronze = 263 Spieler 2 erhalt 1 Gold (100) + 14 Silber (140) + 24 Bronze = 264 Beide erhalten also möglichst den gleichen Wert aus einem bestehenden Pool unterschiedlich wertvoller Münzen. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group