8 Zellen und 6 Zahlen, und die Summe in den 8 Zellen darf immer nur 6 ergeben, wie kann mir Excel helfen alle Kombinationsmöglichkeiten zu finden?

... komplette Frage anzeigen

3 Antworten

https://de.wikipedia.org/wiki/Partitionsfunktion

Oder - besonders falls die Zerlegungen unabhängig von der Anordnung ihrer Elemente sein sollen oder können - ein rekursiver Branch-and-bound-Algorithmus.

Antwort bewerten Vielen Dank für Deine Bewertung

Ich würde das so machen, dass ich alle Zahlen generiere, also pro Stelle eine Ziffer und dann die Ziffern mit Übertrag immer hochzähle.

In einer Spalte dahinter berechne ich die Summe. Dann filtere ich nach der Summe 6. Das Ergebnis kann ich dann extrahieren.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Suboptimierer
25.01.2016, 12:30

Falls die Zeilenanzahl nicht ausreichen würde, würde ich mir ein Makro programmieren. Ich habe 1716 Lösungen heraus bekommen:

Sub ZahlenGenerieren()
  Dim a, b, c, d, e, f, g, h As Integer
  Dim iAktZeile As Integer

Application.ScreenUpdating = False On Error GoTo Fehler iAktZeile = 1 For a = 1 To 8 Cells(iAktZeile, a).Value = 0 Next Cells(iAktZeile, 9).Formula = "=SUM(A" & iAktZeile & ":H" & iAktZeile & ")"
For a = 0 To 6 Cells(iAktZeile, 1).Value = a IncZeile iAktZeile For b = 0 To 6 Cells(iAktZeile, 2).Value = b IncZeile iAktZeile For c = 0 To 6 Cells(iAktZeile, 3).Value = c IncZeile iAktZeile For d = 0 To 6 Cells(iAktZeile, 4).Value = d IncZeile iAktZeile For e = 0 To 6 Cells(iAktZeile, 5).Value = e IncZeile iAktZeile For f = 0 To 6 Cells(iAktZeile, 6).Value = f IncZeile iAktZeile For g = 0 To 6 Cells(iAktZeile, 7).Value = g IncZeile iAktZeile For h = 0 To 6 Cells(iAktZeile, 8).Value = h IncZeile iAktZeile Next Next Next Next Next Next Next Next
If Cells(iAktZeile, 9).Value <> 6 Then _ Cells(iAktZeile, 9).EntireRow.Delete
Fehler:
Application.ScreenUpdating = True On Error GoTo 0
MsgBox "Fertig!" End Sub
Sub IncZeile(ByRef iZeile As Integer) Dim i As Integer If Cells(iZeile, 9).Value = 6 Then Range("A" & iZeile & ":I" & iZeile).Copy Destination:=Range("A" & iZeile + 1 & ":I" & iZeile + 1) iZeile = iZeile + 1 Cells(iZeile, 9).Formula = "=SUM(A" & iZeile & ":H" & iZeile & ")" End If End Sub
1

Die Frage geht schon etwas an die Grenzen bzgl. Excel... zumindest mit meinem lückenhaften mathematischen Verständnis kann das Problem nicht so formulieren, dass es automatisiert gelöst werden kann.

Im Bild: So könnte man halbwegs systematisch die Kombinationen von 5 und 1 erstellen. Wenn man die Zahlen umdreht, also 1 und 5 ergibt sich das gleiche Muster. Allerdings nur, wenn die Zahlen unterschiedlich sind: bei 3 und 3 entfällt diese Variante.

Dieses Muster könnte man sich über ein Makro "malen" lassen: In leicht geänderter Variante für 2, 3, 4 oder 5 Zahlen. Das Schema ist immer sehr ähnlich.

Was ich eher mit Hirnschmalz lösen würde, ist die Ermittlung welche Zahlenkombinationen die Summe 6 ergeben bzw. welche Reihenfolgen es gibt

Mit 2 Zahlen also 5/1, 4/2 und 3/3

Kombinationen 5/1, 1/5, 4/2, 2/4, 3/3

Für diese 5 Ausprägungen also über Makro das "Muster" erstellen lassen und das Spiel mit den anderen Varianten (3 Zahlen, 4 Zahlen, 5 Zahlen) wiederholen.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Suboptimierer
25.01.2016, 13:02

Was häufig geht, ist einfach in einer Spalte von 1 bis x zu inkrementieren, dann die einzelnen Stellen über TEIL auf die Spalten verteilen und über die Spalten dann eine Summe zu ziehen und im Nachgang ungültige Ziffern auszuschließen.

In diesem Fall ergäben sich aber, fürchte ich, zu viele Kombinationen vor Filterung.

0
Kommentar von Ninombre
25.01.2016, 13:02

Das hätte eigentlich noch in die Antwort gehört:

Die Variante für 2 Werte

Sub listen2()
Dim a, b, i, j, x As Integer
Dim z As Long
For x = 1 To 5
Select Case x
Case 1:
a = 5
b = 1
Case 2:
a = 1
b = 5
Case 3:
a = 3
b = 3
Case 4:
a = 4
b = 2
Case 5:
a = 2
b = 4
End Select
i = 1
j = i + 1
z = Cells(Rows.Count, 8).End(xlUp).Row + 1
While i <= 8
While j <= 8
Tabelle3.Cells(z, i) = a
Tabelle3.Cells(z, j) = b
j = j + 1
z = z + 1
Wend
i = i + 1
j = i + 1
Wend
Next
End Sub

0

Was möchtest Du wissen?