Ich bin auf die folgende Problembeschreibung gestoßen.
Sie haben eine Liste von natürlichen Zahlen der Größe
N
und müssen die Werte in zwei ListenA
undB
der GrößeN/2
verteilen, so dass die quadrierte Summe vonA
-Elementen am nächsten ist möglich zur Multiplikation derB
Elemente.Beispiel: Betrachten Sie die Liste 7 11 1 9 10 3 5 13 9 12.
Die optimierte Verteilung ist:
Liste A: 5 9 9 12 13
Liste B: 1 3 7 10 11
was zur Differenz abs ((5 + 9 + 9 + 12 + 13) ^ 2 - (1 * 3 * 7 * 10 * 11)) = 6
führt Ihr Programm sollte daher 6 ausgeben, was der minimal erreichbare Unterschied ist.
Was ich versucht habe:
Ich habe Greedy versucht, um dieses Problem zu lösen. Ich nahm zwei Variablen sum
und mul
. Jetzt begann ich, Elemente aus der gegebenen Menge nacheinander zu nehmen und versuchte, sie sowohl in die Variablen als auch in die berechnete Stromstärke zu addieren
Quadrat der Summe und Multiplikation. Schließen Sie nun das Element in einer der beiden Mengen ab, sodass die Kombination den minimal möglichen Wert ergibt.
Aber dieser Ansatz funktioniert in dem gegebenen Beispiel nicht selbst. Ich kann nicht herausfinden, welcher Ansatz hier verwendet werden könnte.
Ich bin nicht und frage nach genauem Code für die Lösung. Jeder mögliche Ansatz und der Grund, warum es funktioniert, wäre in Ordnung.
BEARBEITEN:
Quelle: Codingspiel, Gemeinschaftsrätsel
Probieren Sie es aus:
%Vor%Code aus dieser Stackoverflow-Antwort , werfen Sie auch einen Blick auf dieser Wikipedia-Artikel über Kombinationen.
Ich bin nicht sicher, ob es eine genaue Lösung in Polynomialzeit gibt. Aber Sie könnten versuchen, einen auf Simulated-Annealing basierenden Ansatz zu verwenden.
Mein Ansatz wäre:
Gieriger Schritt: Suchen Sie ein Element, das Sie zwischen der Liste verschieben können, die den Fehler optimiert.
Zufallsschritt: Wählen Sie ein zufälliges Element aus einem dieser beiden Sätze und berechnen Sie den Fehler. Wenn der Fehler besser ist, behalte es. Ansonsten mit der Wahrscheinlichkeit von q halte es.
Stellen Sie bei einem dieser beiden Schritte sicher, dass der neue Status nicht bereits erforscht ist (oder zumindest davon abschrecken).
Setzen Sie p auf einen kleinen Wert (& lt; 0,1) und q könnte von der Fehlerdifferenz abhängen.