Teilen Sie ein Array in gleicher Größe, so dass der Wert der angegebenen Funktion minimal ist

8

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 Listen A und B der Größe N/2 verteilen, so dass die quadrierte Summe von A -Elementen am nächsten ist möglich zur Multiplikation der B 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

    
Kaushal28 12.06.2017, 14:34
quelle

2 Antworten

1

Probieren Sie es aus:

%Vor%

Code aus dieser Stackoverflow-Antwort , werfen Sie auch einen Blick auf dieser Wikipedia-Artikel über Kombinationen.

    
Eritrean 13.06.2017 10:08
quelle
0

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:

  1. Initialisiere listA und listB in einen zufälligen Zustand
  2. Mit Wahrscheinlichkeit p gierigen Schritt ausführen, andernfalls einen zufälligen Schritt ausführen
  3. Verfolgen Sie den Status und den entsprechenden Fehler (mit einer HashMap)

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.

    
ElKamina 12.06.2017 19:33
quelle

Tags und Links