Ich würde vorschlagen, das ganze Array zu summieren und dann die kleinste Summe mit dem Dezimalteil zu finden, der dem der gesamten Summe entspricht. Wenn die Zahlen nicht eine sehr hohe Genauigkeit nach dem Dezimalpunkt haben, was auch immer der Ansatz zum Finden der genauen Zahl ist, sollte diese Umkehr viel Rechenleistung einsparen.
Auch das Sortieren des Arrays und das Gierige aus den kleinsten Zahlen ergeben gute Ergebnisse. Die optimale Lösung hängt jedoch stark von der Art der ursprünglichen Menge ab. Könnten Sie näher spezifizieren, welche Art von Zahlen Sie erwarten?
Der Großteil dieses Codes dient zum Abrufen der Permutationen eines Arrays. Ich bin mir sicher, dass es optimiert werden kann, aber das berechnet 3 Arrays mit Längen von 4, 5 und 6 in 45ms auf einem einzelnen Xeon-Quad-Core-Server. Springt auf etwa 220 ms, wenn ich ein viertes Array mit 7 Dezimalstellen hinzufüge, und satte 2 Sekunden, wenn ich ein Fünftel mit 8 hinzufüge.
Im Grunde werden alle Permutationen des Arrays, das die Floats enthält, abgerufen, und jedes einzelne wird Schlüssel für Schlüssel addiert, und wenn die Summe eine ganze Zahl größer als die aktuelle ganze Zahl ist, wird diese Zahl aktualisiert. Schließlich die größtmögliche Anzahl zurückgeben.
%Vor% Das Guthaben für die Array-Permutationsfunktion geht an dirk dot avery a t gmail
at http://php.net/manual/en/function.shuffle.php
Ich habe den Code dafür nicht geschrieben, aber der Pseudo-Code ist unten. Die allgemeine Idee ist, dass Sie Kombinationen berechnen (x wählen y ... Ссылка ) und dann jede dieser Kombinationen summieren. Sie durchlaufen dies für die Länge des Arrays und nehmen dann Ihre max.
Ich bin mir auch sicher, dass es Optimierungen gibt, gierig zu sein und diese Schleife kurzzuschließen.
%Vor%Das ist ein großes Problem, über das man nachdenken sollte. Aus der Spitze meines Kopfes, das ist der Pseudocode, den ich verwenden würde:
Natürlich musste ich sehen, ob das tatsächlich funktionieren würde. Hier ist der (sehr unordentliche, Wegwerf-Qualität) Code, den ich geschrieben habe, um es zu testen:
%Vor%Es ist ein hässlicher O (N ^ 2) Algorithmus, aber er sollte korrekt sein. Kann jemand ein anfängliches Array sehen, wo dies fehlschlagen würde?
Aus Spaß habe ich mit einem Array von 50 Elementen versucht und die erste Zeile durch folgende Zeilen ersetzt:
%Vor%Auf einen Blick sieht es richtig aus - ich überlasse die Bestätigung jemand anderem;)