Geben Sie für einen Satz von Ganzzahlen 1,2 und 3 die Anzahl der Möglichkeiten an, die diese zu n addieren können. (Die Reihenfolge ist wichtig, dh n ist 5. 1 + 2 + 1 + 1 und 2 + 1 + 1 + 1 sind zwei verschiedene Lösungen)Wie finden Sie die Anzahl der Möglichkeiten, die die ganzen Zahlen 1,2,3 summieren können?
Meine Lösung beinhaltet die Aufteilung von n in eine Liste von 1en, wenn n = 5 , A = [1,1,1,1,1]. Und ich werde mehr Unterlisten rekursiv aus jeder Liste erzeugen, indem ich benachbarte Zahlen hinzufüge. A wird also 4 weitere Listen erzeugen: [2,1,1,1], [1,2,1,1], [1,1,2,1], [1,1,1,2] und jede diese Listen werden weiter Sublisten erzeugen, bis es einen abschließenden Fall wie [3,2] oder [2,3]
(in Python) Hier bin meine vorgeschlagene Lösung
ways = []
def check_terminating(A,n):
# check for terminating case
for i in range(len(A)-1):
if A[i] + A[i+1] <= 3:
return False # means still can compute
return True
def count_ways(n,A=[]):
if A in ways:
# check if alr computed if yes then don't compute
return True
if A not in ways: # check for duplicates
ways.append(A) # global ways
if check_terminating(A,n):
return True # end of the tree
for i in range(len(A)-1):
# for each index i,
# combine with the next element and form a new list
total = A[i] + A[i+1]
print(total)
if total <= 3:
# form new list and compute
newA = A[:i] + [total] + A[i+2:]
count_ways(A,newA)
# recursive call
# main
n = 5
A = [1 for _ in range(n)]
count_ways(5,A)
print("No. of ways for n = {} is {}".format(n,len(ways)))
Darf ich wissen, ob ich erreicht bin auf dem richtigen Weg, und wenn ja, gibt es eine Möglichkeit, diesen Code effizienter zu machen?
Bitte beachten Sie, dass dies kein Münzwechsel Problem ist. Beim Münzwechsel ist die Reihenfolge des Auftretens nicht wichtig. In meinem Problem unterscheidet sich 1 + 2 + 1 + 1 von 1 + 1 + 1 + 2, aber beim Münzwechsel sind beide gleich. Bitte geben Sie für diese Antwort keine Lösungen zum Münzwechsel an.
Edit: Mein Code funktioniert, aber ich würde gerne wissen, ob es bessere Lösungen gibt. Vielen Dank für Ihre Hilfe :)
Haben Sie dies durch einen Compiler ausgeführt? Erhalten Sie Fehler? Wenn nicht, dann versuchen Sie das zuerst, bevor Sie Fragen zu SO stellen. Wenn Sie möchten, dass Ihnen jemand sagt, wie _good_ Ihr Code ist, versuchen Sie Code Review. – jmoon
Btw, das Problem, das Sie lösen, heißt "Partitionierung". – m69
Muss dieser Zahlensatz 1, 2, 3 sein? – bendl