Wenn ich Geschenke für meine beiden Frauen kaufe, möchte ich, dass sie sich für mich gleich wichtig anfühlen, aber es ist schwierig, mit festen Budgets einzukaufen. Stattdessen kaufe ich ein paar Sachen und teile sie in zwei Gruppen mit möglichst gleichem Wert ein. Dann kaufe ich eine Praline, um den Rest zu reparieren.
Aber ich möchte nicht all das harte Heben tun, wenn mein Computer es kann. Und du auch nicht. Lösen Sie dieses Problem, damit Sie wissen, dass es beim nächsten Mal, wenn Sie Geschenke unter Ihren Frauen aufteilen müssen, einfach ist.
Eingang
1 Array von (N * 2) Elementen, wobei N * 2 in der 1. Zeile angegeben ist.
Die Elemente des Arrays in der folgenden Zeile.
Ausgabe
2 Array von jeweils N Elementen, so dass:
Differenz von (Summe der Elemente von Array 1) und (Summe der Elemente von Array 2) so nahe wie möglich bei 0 liegt.
Beispiel
Eingang
4
1 2 3 4
Ausgabe
1 4
2 3
diff=0
Haftungsausschluss : Ich habe keine zwei Frauen. Aber wenn ich mich schlecht fühle, stelle ich mir vor, zwei Frauen zu haben. Und plötzlich bin ich dankbar und froh, dass ich nur einen habe. : D
quelle
1 1 1 1 1 5
die richtige Antwort1 1 1
|1 1 5
, Während1 1 1 1 1
|5
würde mehr Sinn machen.Antworten:
Java
Der Versuch, dieses Problem in zwei Phasen zu lösen:
Eingabe wie
wird bereits nach phase 1 gelöst wie zb
und Eingabe wie
werden beide phasen brauchen damit
(nach Phase eins) wird das Ergebnis von
Obwohl ich garantieren kann, dass dieser Versuch immer eine Lösung liefert, kann ich nicht beweisen, dass in allen Fällen eine optimale Lösung gefunden wird. Bei der Einschränkung gleich großer Listen erscheint es jedoch durchaus realistisch, dass keine Eckfälle zurückbleiben. Beweise mir das Gegenteil ;-)
Programm auf ideone.com
quelle
Brachylog 2
Probieren Sie es online!
Dies ist ein Beliebtheitswettbewerb, aber das bedeutet nicht unbedingt, dass Golfsprachen schlecht passen. (Eigentlich hätte ich in Jelly antworten sollen, weil Jelly-Antworten aus irgendeinem Grund eine unverhältnismäßig hohe Anzahl von Stimmen erhalten, unabhängig davon, wer sie abgibt oder wie gut sie golfen, aber Brachylog ist besser lesbar.)
Wir beginnen damit, die Liste aller Permutationen der Eingabe (
pᶠ
) zu nehmen und jede (ᵐ
) in zwei gleiche Teile aufzuteilen (ḍ
wir könnten ihr einen Index geben, wenn Sie aus irgendeinem Grund mehr als zwei Frauen hätten). Dann ordnen wir die aufgeteilten Permutationen ({…}ᵒ
), indem wir die Summe (+
) jeder (ᵐ
) Hälfte nehmen, die absolute Differenz (dh dieo-
"geordnete Differenz") nehmen und diese Differenzen verwenden, um die Sortierreihenfolge zu definieren. Das beste Ergebnis ist das erste, also nehmen wir den Kopf der Liste mith
, um das Ergebnis zu erhalten.quelle
Mathematica
Eingabeformulare
Die Eingabezeichenfolge muss über STDIN erfolgen.
assets
bezieht sich auf die unter den Ehefrauen (oder Zwillingen) zu verteilenden Beträge.length
ist die Anzahl der Vermögenswerte.Für die vorliegenden Zwecke gehen wir davon aus, dass das Vermögen aus den ganzen Zahlen von 1 bis 20 besteht.
wird bearbeitet
Ist die Verteilung ungerecht? Wählen Sie also eine andere.
@ The Constructor merkt an, dass Frau 2 die Tatsache bestreiten kann, dass Frau 1 das beste Vermögen hat. Das Folgende ergibt also alle "fairen" (Differenz = niedrigste Differenz) Anteile für Frau 1; Frau 2 bekommt das restliche Vermögen; Die Null bezieht sich auf die Vermögensdifferenz der Ehefrauen. Es gibt 5448 Möglichkeiten, Vermögenswerte mit den Gewichten 1 bis 20 zu verteilen. Es werden nur wenige Zeilen angezeigt.
Das Format ist
Die vorherige Einreichung finden Sie unter den Bearbeitungen. Es ist weitaus ineffizienter, wenn man sich darauf verlässt
Permutations
.quelle
J
Es gibt einen Spickzettel mit allen J-Primitiven unter diesem Link , falls Sie zu Hause mitmachen möchten. Denken Sie daran: J wird im Allgemeinen von rechts nach links gelesen, das
3*2+1
heißt 7, nicht 9. Jedes Verb (J für Funktion) ist entweder monadisch, also vorne wief y
, oder dyadisch, also dazwischen wiex f y
.Anmerkungen und Erläuterungen:
u/
bedeutet "umklappenu
", führen Sie also die Binäroperation für jedes Element in der Liste aus. Also zum Beispiel:+/
bedeutet Fold Plus oder Summe ;<.
ist weniger von ,<./
bedeutet also weniger falten oder Minimum .u"1
bedeutet "u
auf eindimensionalen Zellen ausführen ", dh über jede Zeile. Normalerweise sind die Verben in J entweder atomar oder gelten für das gesamte Argument. Dies gilt für beide Argumente, wenn das Verb dyadisch verwendet wird (mit zwei Argumenten). Folgendes berücksichtigen:#:
ist ein Verb, das eine Zahl in ihre binäre Darstellung erweitert. Wenn Sie es in einer Liste mit mehr als einem Element verwenden, werden auch alle Zahlen korrekt ausgerichtet, sodass#:i.2^n
Sie jede binäre Zeichenfolge mit einer Länge erhaltenn
./.
wird dyadisch als Key bezeichnet . Dabei werden die Elemente der Liste auf der linken Seite als Schlüssel und die auf der rechten Seite als Werte verwendet. Es gruppiert jeden Satz von Werten, die einen Schlüssel gemeinsam haben, und führt dann eine Operation an ihnen aus.Im Fall von
]/.
ist die Operation nur das Identitätsverb, daher passiert dort überhaupt nichts Besonderes, aber die Tatsache, dass/.
die Liste für uns aufgeteilt wird, ist das Wichtige. Aus diesem Grund erstellen"1
wir die Binärlisten : Damit wir für jede Liste ( ) die Geschenke für die Frauen auf alle möglichen Arten aufteilen können.1!:1]1
und1!:2&2
sind die Einlese- bzw. Ausleseoperationen. Der1!:n
Teil ist das Verb und die andere Zahl ist das Dateihandle.1
ist console in,2
ist console out und3 4 5
sind stdin, stdout und stderr. Wir verwenden dies auch".
beim Lesen, um die Eingabezeichenfolgen in Zahlen umzuwandeln.quelle
Clojure
Prüfung
quelle
[1 4 5 6 7 8]
Ihr Programm berechnet,[8 5 4]
[7 6 1]
Diff 3
wo eindeutig Lösungen mit einer Differenz von 1 existieren.MATLAB
Hier ist meine Lösung:
Zum Beispiel führt die aktuelle Liste in meinem Quellcode zu:
das ist beide 16.
Wenn ich meinen Code spiele, was weniger Spaß macht, bekomme ich sehr unoptimierte 132 Zeichen. Schlag das ;)
quelle
PHP
Warnung: Sehr schmutziger Code
Er versucht jede mögliche Permutation des Eingabearrays.
Ideone-Beispiel für
4/1 2 3 4
: http://ideone.com/gIi174quelle
Python:
oder ein bisschen golfen:
Oder noch weiter golfen, da die Hälfte der Linien nur Make-up ist. (Angenommen, ich kann nur das rohe interne Array ausgeben, da dies nicht in der Operation angegeben ist.) Sie können das
print
in (zum Beispiel) der interaktiven Shell weglassen und ein[::-1]
(ganz am Ende, nach[0]
) hinzufügen , wenn Sie wirklich wollen der Unterschied zuletzt.(Ergebnisse in
(0, ((1, 2, 7, 8), (3, 4, 5, 6)))
)Dies ist jedoch nur brachial für alle möglichen Kombinationen und sollte nicht als entfernt effizient angesehen werden. Wenn es jedoch nicht darauf ankommt, dass die Liste gleich lang ist, funktioniert dies auch (bei großen Arrays):
Mit dem Code darunter läuft es zum Beispiel kaum anders: 500k auf 10 ^ 10 Maximalwerten sind sozusagen nicht viel. Dies ist auch viel schneller: Wo der andere Code wahrscheinlich nicht in weniger als einem Jahr fertig ist (und das ist sehr optimistisch), dauert dies ungefähr eine halbe Sekunde, obwohl Ihre Laufleistung variieren kann.
quelle
Literate Haskell
Ich benutzte die Listenmonade, um sie aufzuteilen.
Dann machen wir einen Rater.
Und dann eine Funktion, die den Unterschied minimiert.
Und etwas, das sie alle vereint.
Weiter ein Parser.
Und ein Ausgabeformatierer.
Und jetzt das Programm
Beispiel:
quelle