C# :: Aufgabe #103 :: Lösung #1
3 Lösungen

#103
Das Tortenproblem mit Tortenstücken ( Möglichkeiten )
Fortgeschrittener - C#
von klhlubek19
- 16.07.2015 um 13:50 Uhr
k Kinder erhalten t Torten.
Die Torten sind alle gleich groß, haben aber
verschiedene Geschmacksrichtungen:
a) Ananas, b) Brombeer, c) Chocolate, d) Datteln, e) Erdbeer, usw.
Die Torten werden zunächst je in k Stücke geteilt.
Nun erhält jedes Kind (1: Anna; 2: Bert; 3: Claude; 4: Daphne; ...)
von jeder Torte ein Stück.
Danach beginnen die Kinder zu tauschen, denn vielleicht mögen nicht alle jede
Sorte gleich gut. Beim Tauschen achten die Kinder darauf, dass immer jedes
Kind gleich viele Tortenstücke behält.
Auf wie viele Arten können die Kinder die Tortenstücke nun so verteilen,
dass immer noch alle Kinder gleich viele Stücke haben?
Alle Möglichkeiten sind auszugeben.
Die Torten sind alle gleich groß, haben aber
verschiedene Geschmacksrichtungen:
a) Ananas, b) Brombeer, c) Chocolate, d) Datteln, e) Erdbeer, usw.
Die Torten werden zunächst je in k Stücke geteilt.
Nun erhält jedes Kind (1: Anna; 2: Bert; 3: Claude; 4: Daphne; ...)
von jeder Torte ein Stück.
Danach beginnen die Kinder zu tauschen, denn vielleicht mögen nicht alle jede
Sorte gleich gut. Beim Tauschen achten die Kinder darauf, dass immer jedes
Kind gleich viele Tortenstücke behält.
Auf wie viele Arten können die Kinder die Tortenstücke nun so verteilen,
dass immer noch alle Kinder gleich viele Stücke haben?
Alle Möglichkeiten sind auszugeben.
#1

von eulerscheZhl (5230 Punkte)
- 17.07.2015 um 16:49 Uhr

using System; using System.IO; using System.Collections.Generic; using System.Linq; namespace trainYourProgrammer { class MainClass { static void Main(string[] args) { solutions = 0; Console.Write ("Anzahl der Kinder: "); int k = int.Parse (Console.ReadLine ()); Console.Write ("Anzahl der Torten: "); int t = int.Parse (Console.ReadLine ()); int[] pieces = new int[t]; for (int i = 0; i < t; i++) pieces [i] = k; TakePieces (k, t, pieces, new List<int[]>()); Console.WriteLine ("\n{0} Lösungen gefunden", solutions); } static int solutions; static void TakePieces(int childs, int pieces, int[] remaining, List<int[]> previous) { if (childs == 0) { Console.WriteLine (String.Join (" ", previous.Select (x => String.Join (", ", x)))); solutions++; return; } foreach (int[] take in Take(remaining, pieces)) { TakePieces (childs - 1, pieces, Enumerable.Range (0, remaining.Length). Select (i => remaining [i] - take [i]). ToArray (), new List<int[]>(previous) {take} ); } } //nimm genau pieces Stücke aus den verfügbaren, gib alle Möglichkeiten zurück static List<int[]> Take(int[] remaining, int pieces) { List<int[]> result = new List<int[]>(); int[] current = new int[remaining.Length]; TakeRecurs (remaining, pieces, current, 0, result); return result; } static void TakeRecurs(int[] remaining, int pieces, int[] taken, int index, List<int[]> result) { if (index == remaining.Length) { if (pieces == 0) result.Add (taken); return; } for (int take = 0; take <= Math.Min(pieces, remaining[index]); take++) { int[] takenNew = (int[])taken.Clone (); takenNew [index] = take; TakeRecurs (remaining, pieces - take, takenNew, index + 1, result); } } } }
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1