Ich versuche, dieses Problem im einfachen Abschnitt von coderbyte zu lösen, und die Eingabeaufforderung lautet:
Lassen Sie die Funktion ArrayAdditionI (arr) das Array von in arr gespeicherten Zahlen nehmen und geben Sie den String wahr zurück, wenn eine beliebige Kombination von Zahlen im Array bis zur größten Zahl im Array addiert werden kann. Andernfalls geben Sie den String false zurück. Zum Beispiel: wenn arr [4, 6, 23, 10, 1, 3] enthält, sollte die Ausgabe wahr sein, weil 4 + 6 + 10 + 3 = 23. Das Array wird nicht leer sein, wird nicht alle die gleichen Elemente enthalten, und kann negative Zahlen enthalten.
Hier ist meine Lösung.
%Vor%print ArrayAddition ([2,95,96,97,98,99,100])
Ich bin mir nicht einmal sicher, ob das richtig ist, aber es scheint alle Zahlen zu erfassen, die ich anschließe. Ich frage mich, ob es einen besseren Weg gibt, diesen Algorithmus zu lösen, von dem ich nichts weiß. Ich denke, dass eine innerhalb einer für eine Schleife, etc, den Trick tun würde, aber ich weiß nicht, wie das geht.
Was ich im Sinn habe, bewerkstellige dies mit A + B, A + C, A + D ... A + B + C ... A + B + C + D + E
z.B.)
%Vor%Ich habe überall gesucht und den Vorschlag von itertool gefunden, aber ich frage mich, ob es eine Möglichkeit gibt, diesen Code roher zu schreiben.
Danke.
Eine rekursive Lösung:
%Vor%Die GetSum-Funktion gibt False zurück, wenn die erforderliche Summe ungleich Null ist und keine Elemente im Array vorhanden sind. Dann prüft es auf 3 Fälle:
Ihre Lösung funktioniert nicht.
%Vor% Die einfache Lösung besteht darin, itertools
zu verwenden, um über alle Teilmengen der Eingabe zu iterieren (die nicht die größte Zahl enthalten):
Wenn Sie Itertools vermeiden möchten, müssen Sie Subsets direkt generieren. Dies kann erreicht werden, indem man in binär zählt und die gesetzten Bits verwendet, um zu bestimmen, welche Elemente ausgewählt werden sollen:
%Vor%Generiere alle Summen des Powersets und teste sie gegen das Maximum
%Vor%Sie können dies verbessern, indem Sie eine Vorverarbeitung durchführen - suchen Sie zuerst das Maximum und entfernen Sie es von L
Ein weiterer Weg, es zu tun ...
Code:
%Vor%Ausgabe:
%Vor%Hoffe das hilft ..:)
Wenn ich die Frage richtig verstanden habe, sollte das einfach zurückgeben, was Sie wollen:
%Vor%