100 Tiere für 100 €

Hallo hier mal die Fragestellung aus meinem Fragebogen:
Ein Mann will 100 Tiere kaufen die 100 € kosten sollen, je Art soll mindestens 1 Tier dabei sein

Hund = 15€
Katze = 1€
Maus = 0,25€

Ich bekomme das irgendwie nicht hin…
Und nein da steht nix von 0,50 € so wie bei einem anderen Beitrag mit fast der gleichen Aufgabenstellung…

C#-Code
Hallo,

for (int i = 1; i 

Ich hatte nicht die Geduld das so zu lösen... :wink:

Grüße Roman

Hallo,

Hallo hier mal die Fragestellung aus meinem Fragebogen:
Ein Mann will 100 Tiere kaufen die 100 € kosten sollen, je Art
soll mindestens 1 Tier dabei sein
Hund = 15€
Katze = 1€
Maus = 0,25€

3 Hunde,41 Katzen,56 Mäuse
Gruß VIKTOR

PS
Ich war auch nicht so schlau.
Habe mir in Basic ein Programm geschrieben.
Das Programm brauchte 24014 „Probierschritte“ bis zum Ergebnis,
insgesamt 50000.
Es gibt nur eine Kombination welche die Bedingungen erfüllt.

Ich poste meinen mathematischen Ansatz mal auch hier:

Mathematisch gesehen ein klassischer Fall von 2 Gleichungen mit 3 Unbekannten.

Du kannst ja formulieren:

  1. 100 = x * 15 + y + z * 0.25 (x Hunde, y Katzen, z Mäuse)
  2. 100 = x + y + z

Setzt man das gleich erhält man

15x + y + 0.25z = x + y + z

subtrahiert man y und stellt das Ganze um folgt:

x = (0.75 / 14) * z

Nun kommt der kniffelige Teil: Für welches Z ergibt die Multiplikation mit dem Term in der Klammer einen einen ganzzahligen Wert. Die Antwort ist einfach:

Für Z = 14 ergibt die Multiplikation 0.75. Mit was muss ich die 0.75 multiplizieren um einen ganzzahligen WErt zu erreich - mit 4. Der erste ganzzahlige Wert ergibt sich also für Z = 4 * 14 = 56. Für z = 56 ist x = 3 und y folglich 41

Hallo,
sehr schön gedacht, aber raten (probieren)mußt Du auch.

Mathematisch gesehen ein klassischer Fall von 2 Gleichungen
mit 3 Unbekannten.

Ja, aber nicht explizit lösbar.

  1. 100 = x * 15 + y + z * 0.25 (x Hunde, y Katzen, z Mäuse)
  2. 100 = x + y + z
    15x + y + 0.25z = x + y + z
    subtrahiert man y und stellt das Ganze um folgt:
    x = (0.75 / 14) * z
    Nun kommt der kniffelige Teil

eben. Die Frage stellt sich: gibt es mehrere Lösungen ?

usw.

Ansonsten wohl ein guter Ansatz, um die Raterei hier nicht zu
überfordern.
Bei weniger übersichtlichen Fragen eben doch ein Programm schreiben.
So gibt es bei 1000 Tieren welche 1000 Euro kosten mit den angegeben
Einzelpreisen 16 Lösungsmöglichkeiten !
Gruß VIKTOR

Habe mir in Basic ein Programm geschrieben.
Das Programm brauchte 24014 „Probierschritte“ bis zum
Ergebnis,
insgesamt 50000.
Es gibt nur eine Kombination welche die Bedingungen erfüllt.

Hallo Victor,

ich komme auf 1406 Schritte bis zur Lösung bei 3432 Schleifenschritten insgesamt.
Ggfs. könnte man durch Nachdenken bzw. Vordenken sich noch paar Schritte sparen,

Ja, es gibt nur eine Kombination die das erfüllt, bei ,5€ pro maus sind es drei.

nachstehend der Code (Vba)

Gruß
Reinhard

Sub tt()
Dim H, K, M, Anz
For H = 1 To 6
 For K = 1 To 95
 If (H + K) Mod 2 = 0 And (100 - H - K) Mod 4 = 0 Then
 For M = 4 To 96 Step 4
 Anz = Anz + 1
 If H \* 15 + K + M / 4 = 100 And H + K + M = 100 Then
 MsgBox H & Chr(10) & K & Chr(10) & M & Chr(10) & Anz
 End If
 Next M
 End If
 Next K
Next H
MsgBox Anz
End Sub

hi

Hund = 15€
Katze = 1€
Maus = 0,25€

es sind 100 tiere gefordert, und diese müssen 100euro kosten.
folglich muss alle gekaufte tiere durchschnittlich 1 euro kosten.
die katzen haben somit mal kein problem, eine katze mehr=>ein euro mehr.
somit muss die summe der hunde und mäuse gleich gross sein, wie der wert der hunde und mäuse zusammen. diese 15 euro müssen also mit den 0.25 euro kompensiert werden. weiter macht es nur sinn, wenn jeweils 4 mäuse zusammen genommen werden, da es ja eine ganze „euro-zahl“ sein soll. dazu kommt, das es allerhöchstens 6 hunde sein können (7*15 ist 105, 6*15 ist 90), das heisst, nun bein einem hund beginnen und durchprobieren:

4 mäuse + 1 hund = 5 tiere, 16 euro 
40 mäuse + 1 hund = 41 tiere, 25 euro
=\> wir haben zu viel tiere, wenn wir nur einen hund nehmen, also mal mit 2 hunden:
40 mäuse + 2 hunde = 42 tiere 40 euro (schon nah dran=P)
36 mäuse + 2 hunde = 38 tiere 39 euro (das verhältins mus dazwischen liegen, geht aber nicht mit 38mäusen, da sonst .5 euro)
nun mit 3 hunden:
40 mäuse + 3 hunde = 43 tiere, 55 euro
60 mäuse + 3 hunde = 63 tiere, 60 euro
(wieder ein wenig zurück beim nächsten mal:smile:
56 mäuse + 3 hunde = 59 tiere, 59 euro
yahee, und jetz den rest noch mit katzen auffüllen:
=\>56 mäuse, 3 hunde, 41 katzen
-------------------------------

hoffe nun, meine rechnung stimmt=P
lg niemand

Hallo Reinhard

Habe mir in Basic ein Programm geschrieben.
Das Programm brauchte 24014 „Probierschritte“ bis zum
Ergebnis,
insgesamt 50000.
Es gibt nur eine Kombination welche die Bedingungen erfüllt.

ich komme auf 1406 Schritte bis zur Lösung bei 3432
Schleifenschritten insgesamt.
Ggfs. könnte man durch Nachdenken bzw. Vordenken sich noch
paar Schritte sparen,

genau.Man kann die Start-und Endwerte der geschachtelten Schleifen-
durchläufe optimieren, das spart immens.
Jetzt habe ich noch ein paar offensichtliche Begrenzungen
eingebracht und komme auf ca 4300 Schleifendurchläufe.

nachstehend der Code (Vba)

Entspricht etwa meinem Code (P-Basic)

Sub tt()
Dim H, K, M, Anz
For H = 1 To 6

Hier braucht man nur 1-5

For K = 1 To 95

könnte 1-84 ausreichen.

If (H + K) Mod 2 = 0 And (100 - H - K) Mod 4 = 0 Then

Diese Bedingung ist interessant - ich blicke (noch) nicht durch.
Die Maus-Schleife wird nur bedient, wenn H+K durch 2 teilbar und
der Rest zu 100 durch 4 ! Habe ich so richtig verstanden ?
Warum ? Ist die zweite Bedingung nicht ausreichend ?

For M = 4 To 96 Step 4

könnte 32-84 ausreichen.

Anz = Anz + 1
If H * 15 + K + M / 4 = 100 And H + K + M = 100 Then
MsgBox H & Chr(10) & K & Chr(10) & M & Chr(10) & Anz
End If
Next M
End If
Next K
Next H
MsgBox Anz
End Sub

Ich versuche gerade mal für variable Parameter zu programmieren
und auch eventuell für mehr als drei „Objekte“.
Die Schleifenzahl kann dann immens steigen.Solche bedingten
Optimierungen im Lauf (wie von Dir oben) sind da interessant.

Gruß VIKTOR

Hallo Victor,

genau.Man kann die Start-und Endwerte der geschachtelten
Schleifen-durchläufe optimieren, das spart immens.

nicht nur, die M müssen ja auf eine ganzzahlige Eurosumme kommen, also gibt es die nur im Viererpack, also „Step 4“.

For H = 1 To 6

Hier braucht man nur 1-5

das meinte ich mit Vordenken. Ich hatte schon rein im Kopf einfach mal durchdacht ob es möglich ist mit 6 Hunden die Bedingung zu erfüllen und kam auf die Antwort nein.
Als ich dann aber meine Antwort schrieb, das war 2 Stunden später weil ich weg vom PC war, hatte ich aber diesen Gedankengang nicht mehr parat und keine Lust den in Worte zu formulieren.
Abgesehen davon, vielleicht hatte ich ja auch falsch gedacht, deshalb sicherheitshalber 1 To 6 :smile:

For K = 1 To 95

könnte 1-84 ausreichen.

Ich glaube dir und ich hatte Stunden vorher auch irgtendwas in den 80 igern erdacht. Beim gezeigten Code habe ich es mir einfach gemacht,
von jedem Tier mindestens 1 bedeutet ein Viererpack M und 1 H, also 5, ergo max. K = 95

If (H + K) Mod 2 = 0 And (100 - H - K) Mod 4 = 0 Then

Diese Bedingung ist interessant - ich blicke (noch) nicht
durch.
Die Maus-Schleife wird nur bedient, wenn H+K durch 2 teilbar
und
der Rest zu 100 durch 4 ! Habe ich so richtig verstanden ?
Warum ? Ist die zweite Bedingung nicht ausreichend ?

M können nur ganzzahlig auftreten, also 4,8,16,…
Ergo müssen H und K zusammen auch immer gradzahlig sein.
2 H und 1 K geht nicht, sind dann 3 Tiere und M können nicht 97 werden.
Deshalb Mod 2.

Die andere bedingung ist dir ja klar, die Anzahl M muß durch 4 teilbar sein sonst gäbe es keinen ganzzahligen Eurowert.

und auch eventuell für mehr als drei „Objekte“.
Die Schleifenzahl kann dann immens steigen.Solche bedingten
Optimierungen im Lauf (wie von Dir oben) sind da interessant.

Die sind zwingend. Selbst ein Gray-Computer geht bei manchen Dingen in die knie. Und deine, meine, damit verglichen lahme Kiste sowieso.

Wenn du auf dem Gebiet weiter üben willst, nimm dir mal einen Sudoko-Löser als Ziel vor.
Das habe ich auch für mich probiert mit Vba.
Bei so Versuchen lernt man sehr viel.
Auch so Dinge wie was ist eigentlich schneller, Select Case oder IF-ELSEIf. Klar ist Select Case viel besser lesbar aber wenn man Code zeitoptimiert spielt so manches keine Rolle mehr.

Immerhin war mein Code in der lage so ca. 30-40% aller Sudokos zu lösen in wenigen Sekunden.
Die prozentzahl hätte ich bis hin zu 100% schrauben können, einfach in dem ich den Code solange aufrufe bis alles stimmt.
Aber sowas ist mir unwichtig. Ich will ja das rad nicht neu erfinden,
ich will nur wissen wie man, wie ich, so ein Rad baue, ob das unrund läuft, eiert, ist mir Schnuppe, hauptsache es klappt und es dreht sich :smile:)

Wenn du dich für so Codes interessiert, jetzt mal für Sudoko, ich fand im Internet eine in meinen Augen Superlöung in Excel-Vba für Sudokos. An sowas kann man lernen wie profis so peanuts die für mich eine Felsengroße Nuß darstellen lösen.
Bei Interesse zeige ich hier den Link, müßte dazu rumkramen oder den Code.

PS: Danke an den hiesigen Mod wenn du dein Zucken in deinem Löschfinger solange unterdrücken kannst bis Victor, ggfs. ich nochmal geantwortet haben.
Dann walte deines Amtes *gg*

Gruß
Reinhard

Ich bin mir nicht ganz sicher, was die Unlösbarkeit des Problems angeht. Immerhin bin ich auf mathematischem Wege zu immerhin einer Lösung gekommen.

Selbst der letzte Schritt läßt sich ja mathematisch ausdrücken:

aus: 15x+0.25z = x+z folgt ja

56/4 x = 3/4 z - schon haben wir im Nenner die richtige Lösung stehen.


Ich bin fast sicher, dass ein „richtiger“ Mathematiker die Randbedingung x,y,z € Z so einbauen kann, dass er beweisen kann, dass es nur eine Lösung gibt. Im Grunde gehts ja nur darum, 2 Matrizen miteinander zu vergleichen und zu schauen, ob sie in einem oder mehr der Felder identische Werte haben.

Ohne diese Einschränkung gibt es unendlich viele Lösungen, weil die beiden Gleichungen ja Flächen aufspannen, die sich entlang einer Linie schneiden. Bei ganzzahligen Werten handelt es sich aber um eine Kurvenschar, bei denen sich eine Kurve mit der anderen schneiden müsste. *grübel*

Hallo Reinhard

If (H + K) Mod 2 = 0 And (100 - H - K) Mod 4 = 0 Then

Diese Bedingung ist interessant - ich blicke (noch) nicht
durch.
Die Maus-Schleife wird nur bedient, wenn H+K durch 2 teilbar
und
der Rest zu 100 durch 4 ! Habe ich so richtig verstanden ?
Warum ? Ist die zweite Bedingung nicht ausreichend ?

M können nur ganzzahlig auftreten, also 4,8,16,…

ist ja klar, deshalb die 2.Bedingung

Ergo müssen H und K zusammen auch immer gradzahlig sein.

Dies ist aber automatisch gradzahlig wenn die And-Bedingung erfüllt
ist.Sie braucht deshalb nicht extra erfragt werden.
Also - nur die And-Bedingung für den Einstieg in die Maus-Schleife.
Die Katz-Schleife könnte man auch mit step 2 durchführen.
Der Startwert müßte dann entsprechend geradzahlig oder
ungeradzahlig der Laufzahl des Hundes angepasst werden, etwa
If H mod 2 = 1 then …
So fällt einem immer was neues ein.
Bei variablen Parametern wird dies aber komplizierter.

und auch eventuell für mehr als drei „Objekte“.
Die Schleifenzahl kann dann immens steigen.Solche bedingten
Optimierungen im Lauf (wie von Dir oben) sind da interessant.

Wenn du auf dem Gebiet weiter üben willst, nimm dir mal einen
Sudoko-Löser als Ziel vor.

Danke für den Hinweis, aber ich bin schon etwas geübt.Soduko
interessiert mich hier nicht so.

Gruß VIKTOR

Hallo,

Ich bin mir nicht ganz sicher, was die Unlösbarkeit des
Problems angeht. Immerhin bin ich auf mathematischem Wege zu
immerhin einer Lösung gekommen.

nur teils.Probieren mußtest Du auch.
Für Z = 14 ergibt die Multiplikation 0.75.
Eine explizite Formel ist nicht machbar.

Ich bin fast sicher, dass ein „richtiger“ Mathematiker die
Randbedingung x,y,z € Z so einbauen kann, dass er beweisen
kann, dass es nur eine Lösung gibt.

Wie ich schon in meinem anderen Beitrag erwähnte, gibt es bei
1000 Tieren und 1000 Euro 16 Lösungen.(gleiche Preise)

Im Grunde gehts ja nur
darum, 2 Matrizen miteinander zu vergleichen und zu schauen,
ob sie in einem oder mehr der Felder identische Werte haben.

Das ist genau genommen probieren (schauen) ob es passt.
Es ist ähnlich wie mit dem Auffinden von Primzahlen.

Gruß VIKTOR

Hallo.

Hallo hier mal die Fragestellung aus meinem Fragebogen:
Ein Mann will 100 Tiere kaufen die 100 € kosten sollen, je Art
soll mindestens 1 Tier dabei sein

Hund = 15€
Katze = 1€
Maus = 0,25€

Also, im Durchschnitt soll jedes Tier 1€ kosten. Die Katzen erfüllen das, Hunde und Mäuse liegen daneben.
Jeder Hund muss also durch eine Anzahl Mäuse kompensiert werden, so dass der Schnitt wieder 1€ ist.

Ein Hund kostet 14€ über dem Durchschnitt, es müssen also für jeden Hund so viele Mäuse gekauft werden, dass die 0,75€, die diese unter dem Durchschnitt liegen, sich zu 14€ summieren.
Das sind 14/0,75 = 56/3 Mäuse.
Da offensichtlich nur ganze Mäuse gekauft werden können, brauchen wir also 3 Hunde, 56 Mäuse und 41 (den Rest) Katzen.

Probe: 3*15€ + 56*0,25€ + 41*1€ = 45€ + 14€ + 41€ = 100€

Sebastian.

Hallo Viktor,

If (H + K) Mod 2 = 0 And (100 - H - K) Mod 4 = 0 Then

Warum ? Ist die zweite Bedingung nicht ausreichend ?

du hast Recht.

So fällt einem immer was neues ein.
Bei variablen Parametern wird dies aber komplizierter.

und auch eventuell für mehr als drei „Objekte“.
Die Schleifenzahl kann dann immens steigen.

Auch da stimmen wir überein.

Gruß
Reinhard

Ich versuche gerade mal für variable Parameter zu
programmieren
und auch eventuell für mehr als drei „Objekte“.
Die Schleifenzahl kann dann immens steigen.Solche bedingten
Optimierungen im Lauf (wie von Dir oben) sind da interessant.

Hallo Viktor,

soll ich mir das so vorstellen wenn das dein basic hergibt:

sub Test()
call Tiere(100,100,15,1,.25,.11,0.05,0,01)
end sub

D.h. die ersten beiden Variablen geben den Gesamtpreis und die Gesamttieranzahl an, die anderen den Einzelpreis pro Tier.
(Kann man klar noch um die beinanzahl der Tiere erweitern, nicht alle haben vier Beine *gg*)

Dann ist das schon eine Aufgabe das so per Vba zu optimieren wie ich,du es im Kopf gemacht haben.
Denn normal sind drei verschachtelte For-Schleifen von je 1-100 schonmal 1.000.000 Rechenschritte.

Durch Nachdenken konnten wir das gewaltig drosseln.

jetzt habe ich mal getestet wie das an meinem Rechner ist wenn ich ohne Vor/nachdenken da bei drei tieren je von 1 bis 100 zähle, noch ohne jedwede IF-Abfrage.
Das ist unter einer Sekunde fertig.
Nehme ich aber vier Tiere so ist die Codelaufzeit schon so ca. 4 Sekunden.
Ohne Testung ist mir klar, ohne Optimierung bin ich bei so 10 Tieren bei Laufzeiten von 3 tagen oder 2 Wochen, k.A.

Ergo stellt sich die programmtechnische Herausforderung wie kann man
das was man so erdacht hat in den Code einbauen.
Okay, hier ist das falsche Brett dafür.

Wenn du sowieso dabei bist da was in Basic zu programmieren, so mach das. Wenn es läuft kannste es ja ins VB-Brett stellen und fragen wie man deinen Code noch optimieren könnte usw.

Gruß
Reinhard

hi,
sehr schöner ansatz um das problem der hunde/mäuse zu lösen, danke!
lg niemand

Hallo Reinhard,

Ich versuche gerade mal für variable Parameter zu
programmieren
und auch eventuell für mehr als drei „Objekte“.

soll ich mir das so vorstellen wenn das dein basic hergibt:
sub Test()
call Tiere(100,100,15,1,.25,.11,0.05,0,01)
end sub

nun, mein Basic gibt viel her, struktuiertes Programmieren
voll inbegriffen.(PowerBasic-Compiler, Zusatz-Tools)
Variable Parameter bedeutet, daß ich einer Eingaberoutine bedarf,
welche die frei wählbaren Parameter aufnimmt.
Da auch die Anzahl der Tierarten (Werte) variabel ist, sind auch
vorgegebene for …next - Strukturen nicht machbar und müssen
durch andere Vorgehensweise ersetzt werden.
Oder hast Du eine Idee, wie ich eine verschachtelte for…next…
Struktur (mit genau diesem „Werkzeug“) variabel nutzen kann ?
Integer-Variable kann ich auch nur teilweise anwenden, da bei
nicht ganzzahliegen Preisen (Werten) der Tiere Rundungsfehler
auftreten.Es muß also ein Datentyp verwendet werden, der die
Ziffern intern genau so abbildet, wie ich sie dezimal schreiben
würde.

Bei unserer Vorgehensweise ist die Ganze Mausschleife (die letzte
Schleife generell)übrigens überflüssig.
Da wir hier im Brett „Denkspiele“ sind,überlasse ich Dir vorerst mal
das Raten, warum es so ist.
Bei meinem neuen Programm, welches langsam wird, (noch Test usw.
erforderlich) brauche ich nur 237 ! Vergleichsschritte bis zum
Ergebnis - bei unserem fixen Beispiel.

Ergo stellt sich die programmtechnische Herausforderung wie
kann man
das was man so erdacht hat in den Code einbauen.
Okay, hier ist das falsche Brett dafür.

Wenn du sowieso dabei bist da was in Basic zu programmieren,
so mach das. Wenn es läuft kannste es ja ins VB-Brett stellen
und fragen wie man deinen Code noch optimieren könnte usw.

Sehr viel nicht, wenn man variabel ist.
Wenn man die Reihenfolge der Werte (Tierpreise) vom kleinsten zum
größten abarbeitet kann man Start- und Endwert der Schleifen
(oder der simulierten Schleifen wie bei mir)in einer speziellen
Routine optimieren - das ist auch alles.
(eventuell noch Schrittweiten, doch das wird für Zwischenschleifen
kompliziert)
Wir hatten dies ja schon durch „Überlegung“ teils gemacht speziell
für dieses Beispiel.

Wenn ich fertig bin, melde ich mich noch mal.

Gruß VIKTOR

Hallo Reinhard,

Ich versuche gerade mal für variable Parameter zu
programmieren
und auch eventuell für mehr als drei „Objekte“.

Wenn du sowieso dabei bist da was in Basic zu programmieren,
so mach das. Wenn es läuft kannste es ja ins VB-Brett stellen
und fragen wie man deinen Code noch optimieren könnte usw.

ich habe mein Programm jetzt mal fertig gestellt für variable
Parameter, also auch für eine frei wählbare Anzahl von Tierarten.
Es sind mir da noch einige Optimierungsmöglichkeiten eingefallen

  • nicht dramatisch aber in der Summe Laufzeitverkürzung um den
    Faktor 10 !
    So ergibt z.Bsp. die Lösung der Aufgabe:
    6 Tierarten (Euro 25, 16 ,4 , 2, 1, 0.25),Anzahl der Tiere gesamt
    500, Gesamtpreis der Tiere 200 Euro -
    28 Treffer mit einer Laufzeit von ca 12s bis zum letzten Treffer.
    Danach noch ca. 65s „Leerlauf“ ohne Treffer.
    Wenn man eine Abbruchbedingung vorher errechnen könnte, welche den
    Leerlauf kappt wäre dies schon gut.Vielleicht fällt mir was ein.
    Sollte Dich meine Lösung interessieren, könnte ich sie Dir zusenden,
    eventuelle auch gleich die lauffähige EXE-Datei.
    Hier interessiert sich wohl kaum noch einer dafür.

Gruß VIKTOR

PS.
Der Zeitbedarf für die Lösung der Ursprungsaufgabe beträgt nur
ca 200 Microsekunden (0.0002s)