Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Prüfungen im Bachelor-Studium (1. - 5. Semester) » aud » Forendiskussionen » codezuraufgabe7 (Übersicht)
no way to compare when less than two revisions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
— | pruefungen:bachelor:aud:loesungss16:codezuraufgabe7 [03.04.2017 13:19] (aktuell) – angelegt Danplan | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | <code java> | ||
+ | import java.util.*; | ||
+ | |||
+ | public class Jul16_Backtrack { | ||
+ | public static void main(String[] args) { | ||
+ | List< | ||
+ | List< | ||
+ | List< | ||
+ | |||
+ | Tauziehen test=new Tauziehen(); | ||
+ | System.out.println(test.tauziehen(in).toString()); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | class Tauziehen { | ||
+ | private static List< | ||
+ | |||
+ | private static long abDiff, yzDiff; | ||
+ | |||
+ | public static List< | ||
+ | a = new LinkedList<> | ||
+ | b = new LinkedList<> | ||
+ | y = null; // erste Ergebnisliste | ||
+ | z = null; // zweite Ergebnisliste | ||
+ | abDiff = 0; // Differenz der Summe der Werte in a bzw. b | ||
+ | yzDiff = 0; // Differenz der Summe der Werte in y bzw. z | ||
+ | for (Long v : a) { | ||
+ | abDiff += v; | ||
+ | } | ||
+ | helfer(0); | ||
+ | System.out.println(" | ||
+ | return Arrays.asList(y, | ||
+ | } | ||
+ | |||
+ | private static void helfer(int p) { // p durchlaeuft alle Positionen in a | ||
+ | // Basisfall a und b (fast) gleich gross erreicht? | ||
+ | if (Math.abs(a.size() - b.size()) <= 1) { | ||
+ | if (y == null && z == null // erste Loesung benoetigt | ||
+ | // oder bessere Loesung gefunden | ||
+ | || (Math.abs(abDiff) < Math.abs(yzDiff))) { | ||
+ | // merke beste bisher gefundene Loesung: | ||
+ | y = new LinkedList<> | ||
+ | z = new LinkedList<> | ||
+ | System.out.println(" | ||
+ | yzDiff = abDiff; | ||
+ | } | ||
+ | |||
+ | } else if (p < a.size()) { // kein Abbruch | ||
+ | // Rekursion 1: p-ter Wert bleibt in a: | ||
+ | helfer(p + 1); | ||
+ | // Rekursion 2: p-ten Wert von a nach b verschieben: | ||
+ | abDiff-=2*(a.get(p)); | ||
+ | b.add(a.remove(p)); | ||
+ | helfer(p); | ||
+ | |||
+ | // Backtracking zur 2. Rekursion: | ||
+ | abDiff+=2*b.get(b.size()- 1); | ||
+ | a.add(p, b.remove(b.size() - 1)); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | private static String getSum(List< | ||
+ | int res=0; | ||
+ | for(Long e:y2) | ||
+ | res +=e; | ||
+ | |||
+ | return res+""; | ||
+ | } | ||
+ | } | ||
+ | </ |