Exaktes Ergebnis durch Operationsreihe

Neue Frage »

Wanderhabicht Auf diesen Beitrag antworten »
Exaktes Ergebnis durch Operationsreihe
Meine Frage:
Man hat eine Ausgangszahl. Sagen wir 4874. Man hat verschiedene Zahlen.
z.B 563 206 284 155 335 105 144 79 170 34 47 26 56.
Man soll durch Subtraktion der gegebenen Zahlen auf ein exaktes Ergebnis kommen. Sagen wir 1997.
Man kann die Zahlen beliebig oft verwenden.
Gibt es eine Methode um herauszufinden ob es überhaupt möglich ist.
Wenn ja - gibt es ein Verfahren.

Meine Ideen:
Meine Idee ist nur die Endziffern zu betrachten und von 4 auf 7 durch die letzten Ziffern der gegebenen Zahlen zu kommen durch rumprobieren.
Oder ein Programm
Luftikus Auf diesen Beitrag antworten »

Klingt für mich nach Programm und "Brute Force"..smile

Differenz = Anfangszahl - Endzahl

Die Subtrahenden der Grösse nach absteigend sortieren und dann die Summen davon variieren,
erstmal mit Faktor 1, dann ggfs. von der Kleinsten zur Grössten die Anzahl erhöhen. Wenn die Summe dann grosser ist als die Differenz, jeweils die grösste Zahl rausschmeissen..
Wanderhabicht Auf diesen Beitrag antworten »

was hälst du davon:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
def ist_differenz_erreichbar(zahlen, ziel):
    # Initialisiere das Array mit False
    reachable = [False] * (ziel + 1)
    reachable[0] = True  # 0 ist immer erreichbar (durch keine Zahl)

    for a in zahlen:
        for x in range(ziel - a + 1):
            if reachable[x]:
                reachable[x + a] = True

    return reachable[ziel]

# Gegebene Zahlen
zahlen = [563, 206, 284, 155, 335, 105, 144, 79, 170, 34, 47, 26, 56]
ziel = 2877

if ist_differenz_erreichbar(zahlen, ziel):
    print("Die Differenz ist erreichbar.")
else:
    print("Die Differenz ist NICHT erreichbar.")


Edit by IfindU: Code-Blöcke ersetzt, da python whitespace "sensitive" ist.
Wanderhabicht Auf diesen Beitrag antworten »

und davon

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
def find_solutions(zahlen, ziel, start=0, aktueller_summe=0, aktuelle_kombination=None, lösungen=None, memo=None):
    if aktuelle_kombination is None:
        aktuelle_kombination = []
    if lösungen is None:
        lösungen = []

    if memo is None:
        memo = {}

    # Wenn die Summe die Ziel-Differenz erreicht, Lösung speichern
    if aktueller_summe == ziel:
        lösungen.append(aktuelle_kombination.copy())
        return lösungen
    # Wenn die Summe die Ziel-Differenz übersteigt, abbrechen
    if aktueller_summe > ziel:
        return lösungen

    # Memoization key
    key = (start, aktueller_summe)
    if key in memo:
        return lösungen

    for i in range(start, len(zahlen)):
        neue_summe = aktueller_summe + zahlen[i]
        if neue_summe > ziel:
            continue
        aktuelle_kombination.append(zahlen[i])
        find_solutions(zahlen, ziel, i, neue_summe, aktuelle_kombination, lösungen, memo)
        aktuelle_kombination.pop()

    memo[key] = True
    return lösungen

# Beispiel-Daten
zahlen = [563, 206, 284, 155, 335, 105, 144, 79, 170, 34, 47, 26, 56]
ziel = 2877

lösungen = find_solutions(zahlen, ziel)
print(f"Gefundene Lösungen ({len(lösungen)}):")
for idx, lösung in enumerate(lösungen, 1):
    print(f"Lösung {idx}: {lösung}")

Edit by IfindU: Code-Blöcke ersetzt, da python whitespace "sensitive" ist.
IfindU Auf diesen Beitrag antworten »

Ich habe noch Code-Blöcke gesetzt, damit man den Code besser lesen (und kopieren) kann. Ein allgemeiner Hinweis. Eine notwendige Bedingung wird sein, dass der ggT aller Zahlen in der Liste ein Teiler der gesuchten Zahl ist. Nach Euklid kann man die Zahl nun immer "erreichen", wenn man nicht nur subtrahieren, sondern auch addieren kann. Wenn der ggT kein Teiler ist, kann man selbst mit Zunahme von Addition niemals zum Ziel kommen. Allerdings ist aus praktischen Gründen wohl irrelevant, weil es weit weg von hinreichend ist und vermutlich der ggT bei einer größeren "zufälligen" Liste vermutlich eh meistens 1 ist.
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »