Aufteilungsproblem

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Jean

Betreff: Aufteilungsproblem

BeitragSa, Nov 18, 2006 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragSa, Nov 18, 2006 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Blitzcoder

Newsposter

BeitragSa, Nov 18, 2006 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Nov 18, 2006 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragSa, Nov 18, 2006 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragSa, Nov 18, 2006 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 19, 2006 0:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile )

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

BeitragSo, Nov 19, 2006 2:38
Antworten mit Zitat
Benutzer-Profile anzeigen
c64 hat Folgendes geschrieben:
Zum zufall , www.blitzbase.de/befehle2d/rndseed.htm , das mag zwar doppelt gemoppelt sein dennoch ist es nicht sinnlos.


doch Wink

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 Rolling Eyes

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

BladeRunner

Moderator

BeitragSo, Nov 19, 2006 10:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 19, 2006 12:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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 !! Wink


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]

BladeRunner

Moderator

BeitragSo, Nov 19, 2006 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group