Set in 2 gleichgroße Teile zerlegen

techdevil

Aktives Mitglied
Hi,

In einem Array liegen beliebig viele natürliche zahlen. Nun möchte ich einen Algorithmus, der das Array in 2 Teile mit gleicher Summe partitioniert oder, wenn das nicht möglich ist, eben das ausgibt.
Beispiel: A={1,2,997,1000}
Ausgabe: "Summe: 1000"
Jemand eine Idee?
 

function

Bekanntes Mitglied
erst einmal würde ich alle zahlen des arrays addieren und mit %2 gucken ob es überhaupt 2 gleich große teile geben kann... Wenn das klappt die größte zahl nehmen und versuchen zahlen zuaddieren um "die hälfte" zusammen zu addieren...
das array vorab sortieren hilft oftmals...
 

function

Bekanntes Mitglied
Java:
int sum = 0;
for(int ele : zahlenArray)
 sum += ele;

if( sum%2 == 1) 
  // geht nicht...
sowas zb. wie man das programm weiter baut kannst du ja selbst überlegen und was posten ;)
 

techdevil

Aktives Mitglied
Mein Problem ist eigentlich, dass bei der Addition auch ein Element ausgelassen werden kann.
Hier wäre die Summe z.B. 21:
Array={1,4,4,5,6,10,12};
Das Erreicht man Aber nur mit 12,5,4 bzw. 10,6,4,1
Ich weiss nicht, wie ich da welche for-schleifen schachteln soll...
 

function

Bekanntes Mitglied
was ich gepostet habe sollte war auch nur quasi ein vorab test, weil wenn die gesamt summe des arrays nicht durch 2 teilbar ist, dann kann man das array auch nciht in 2 gleich "große" arrays teilen...
 

function

Bekanntes Mitglied
für den groben alg.: bei deinem beispiel kommst du in etwa auf so einen ablauf:
12+1 < 21 -> 12+1+4 < 21 -> 12+1+4+4 == 21 fertig

noch ein anderes beispiel:
{1, 2, 4, 4, 5, 6}
6+1 < 11 -> 6+1+2 < 11 -> 6+1+2+4 > 11 -> abbruch
6+1+4 = 11 fertig
 

techdevil

Aktives Mitglied
Java:
double sum=Array[Array.length-1];
			for(int i=0;i<Array.length;i++){
				
				sum=sum+Array[i];
				if(sum>b){?}
				if(sum==b){break;}
				if(sum<b){void}
			}

b ist hier also "die Hälfte".
Komme aber nicht weiter...
 

Marco13

Top Contributor
Das schöne bei NP-vollständigen Problemem: Man braucht gar nicht erst zu versuchen, sich eine effiziente Lösung zu überlegen :D

In diesem Fall kann man die Lösung folgendermaßen finden: Man betrachtet alle möglichen Teilmultimengen der Eingabemultimenge. Für jede dieser Teilmultimenge bestimmt man die Differenz zwischen der Eingabemultimenge und der Teilmultimenge (also den Rest, der nicht in der Teilmultimenge ist...). Wenn die Teilmultimenge und die Differenz die gleiche Summe ergeben, ist man fertig.

Eigentlich musst du nur alle Teilmultimengen der Eingabemultimenge bestimmen können... wenn man das erstmal hat (hier mal mit dem "PowerSetIterable" von http://www.java-forum.org/codeschnipsel-u-projekte/81973-combinatorics.html gelöst) ist der Rest ganz einfach:
Java:
public class Partitioning
{
    public static void main(String args[])
    {
        partition(new int[]{1,2,997,1000});
        partition(new int[]{1,4,4,5,6,10,12});
        partition(new int[]{1,4,4,5,6,11,10,12});
    }
    
    private static void partition(int array[])
    {
        Integer input[] = new Integer[array.length];
        for (int i=0; i<array.length; i++)
        {
            input[i] = array[i];
        }
        PowerSetIterable<Integer> psi = new PowerSetIterable<Integer>(input);
        for (Integer a[] : psi)
        {
            List<Integer> x = Arrays.asList(a);
            List<Integer> y = difference(Arrays.asList(input), x);
            if (sum(x) == sum(y))
            {
                System.out.println(
                    "Result for "+Arrays.toString(input)+
                    " with sum "+sum(x));
                System.out.println(x);
                System.out.println(y);
                return;
            }
        }
        System.out.println("No result for "+Arrays.toString(input));
    }
    
    private static List<Integer> difference(List<Integer> a, List<Integer> b)
    {
        List<Integer> result = new ArrayList<Integer>(a);
        for (Integer i : b)
        {
            result.remove(i);
        }
        return result;
    }
    
    private static int sum(Collection<Integer> c)
    {
        int sum = 0;
        for (Integer i : c)
        {
            sum += i;
        }
        return sum;
    }
}


Ausgabe:
Code:
Result for [1, 2, 997, 1000] with sum 1000
[1, 2, 997]
[1000]
Result for [1, 4, 4, 5, 6, 10, 12] with sum 21
[1, 4, 6, 10]
[4, 5, 12]
No result for [1, 4, 4, 5, 6, 11, 10, 12]
 

Marco13

Top Contributor
Ne, is nicht so schlimm :)

Du hast einen Array, und brauchst alle möglichen Teil-Arrays - das ist das eigentlich schwierige... (Ist das eine Hausaufgabe?)
 

Marco13

Top Contributor
Hmja, da man sich vermutlich auf Eingaben mit weniger als 32 (oder meinetwegen 64) Elementen beschränken kann, kann man das mit dem Bitmuster einer Zahl erledigen, die man hochzählt. Sag' bescheid wenn's da Schwierigkeiten gibt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK Variablen Teile eines Arrays zufällig sortieren Java Basics - Anfänger-Themen 7
B String auseinander nehmen in verschiedene Teile Java Basics - Anfänger-Themen 9
J Teile der Funktionalität von Klassen in Methoden platzieren. Java Basics - Anfänger-Themen 3
Y Teile und Herrsche, längstes absteigendes Teilarray bestimmen Java Basics - Anfänger-Themen 12
B Gewisse Teile aus String ausschneiden Java Basics - Anfänger-Themen 5
O String Teile auslesen Java Basics - Anfänger-Themen 4
B Teile eines Strings in Zahl umwandel und damit weiterrechnen? Java Basics - Anfänger-Themen 3
J Strings nach Teile sortieren Java Basics - Anfänger-Themen 4
G Methoden Nicht überlappte teile eines Rechteck's Java Basics - Anfänger-Themen 9
M Teile einer Website auslesen? Java Basics - Anfänger-Themen 2
I Teile und Herrsche Java Basics - Anfänger-Themen 29
R String zerstückeln und Teile in int wandeln Java Basics - Anfänger-Themen 5
D Teile eines Time-Strings nutzen Java Basics - Anfänger-Themen 8
R Teile aus einem mehrdimensionalen Array vergleichen Java Basics - Anfänger-Themen 3
J Datei einlesen teile aus lines ändern und wieder rausschreiben. Java Basics - Anfänger-Themen 4
K String teile auslesen Java Basics - Anfänger-Themen 5
B Teile einer Image in neue Image kopieren Java Basics - Anfänger-Themen 4
P Teile aus Datei lesen und zus mit Strings in Datei speichern Java Basics - Anfänger-Themen 4
G welche Teile der api sind wichtig? Java Basics - Anfänger-Themen 3
M Filesplitting - Teile einer Datei auslesen Java Basics - Anfänger-Themen 7
V Teile eines Strings intelligent ersetzen, kompliziert! Java Basics - Anfänger-Themen 4
D Teile aus String in Array packen Java Basics - Anfänger-Themen 4
V Aus mehreren Zeilen bestimmte Teile auslesen Java Basics - Anfänger-Themen 8
M Teile eines Textes herrausfiltern Java Basics - Anfänger-Themen 7
E String zerlegen aus args Java Basics - Anfänger-Themen 1
I Zerlegen von String Java Basics - Anfänger-Themen 3
J Pfad zerlegen Java Basics - Anfänger-Themen 2
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
nonickatall Input/Output Zeichenkette in Array zerlegen Java Basics - Anfänger-Themen 2
O Best Practice Datei-Pfad zerlegen Java Basics - Anfänger-Themen 4
L String zerlegen & elemente hinzufügen Java Basics - Anfänger-Themen 5
M Erste Schritte Zeichenkette zerlegen Java Basics - Anfänger-Themen 5
X Wie kann ich Zahlen in einzelne Zifferne zerlegen? Java Basics - Anfänger-Themen 3
B Eine ganze Zahl zerlegen. Java Basics - Anfänger-Themen 4
M String zerlegen anhand anderer String Java Basics - Anfänger-Themen 6
Orkanson Methoden String in Wörter zerlegen und Endungen der Wörter überprüfen. Java Basics - Anfänger-Themen 4
H Path2D zerlegen und Objekt drauf "laufen" lassen Java Basics - Anfänger-Themen 11
Shizmo 2dim Objekt in 1dim zerlegen? Java Basics - Anfänger-Themen 13
Silvascus String zerlegen Java Basics - Anfänger-Themen 6
H String zerlegen Java Basics - Anfänger-Themen 16
B Zahlen zerlegen und verwenden Java Basics - Anfänger-Themen 2
I String gezielt zerlegen Java Basics - Anfänger-Themen 5
L Zeichenkette zerlegen Java Basics - Anfänger-Themen 4
D String zerlegen Java Basics - Anfänger-Themen 2
B Best Practice JSON Datei zerlegen Java Basics - Anfänger-Themen 1
H String mit Leerzeichen in Variablen zerlegen Java Basics - Anfänger-Themen 4
F Erste Schritte Pattern zum Zerlegen von selbstdefinierten Dateinamen Java Basics - Anfänger-Themen 7
B String zerlegen Java Basics - Anfänger-Themen 25
T String zerlegen Java Basics - Anfänger-Themen 15
K Bestimmten String zerlegen Java Basics - Anfänger-Themen 12
L Zertifikat Subject DN zerlegen Java Basics - Anfänger-Themen 6
W Zahl/Wort in ein Array zerlegen Java Basics - Anfänger-Themen 6
H String zerlegen in einzelne Buchstaben (char)?? Java Basics - Anfänger-Themen 7
M String an bestimmten Stellen zerlegen Java Basics - Anfänger-Themen 12
M Integer.parseInt String zerlegen Java Basics - Anfänger-Themen 6
H Long (64Bit) in 2 int (32Bit) zerlegen Java Basics - Anfänger-Themen 2
I String ohne Zeichen zerlegen lassen Java Basics - Anfänger-Themen 5
A Zahl zerlegen Java Basics - Anfänger-Themen 3
G String zerlegen? Java Basics - Anfänger-Themen 2
T String zerlegen? Java Basics - Anfänger-Themen 25
J Strings zerlegen Java Basics - Anfänger-Themen 15
G String zerlegen Java Basics - Anfänger-Themen 14
M String zerlegen Java Basics - Anfänger-Themen 6
O String mit split zerlegen Java Basics - Anfänger-Themen 6
J String zerlegen mit mehreren trennzeichen Java Basics - Anfänger-Themen 3
L zahl in einzelzahlen zerlegen Java Basics - Anfänger-Themen 5
G int-Wert in seine byte-Werte zerlegen Java Basics - Anfänger-Themen 3
M Strings zerlegen und Schlüsselwörter finden Java Basics - Anfänger-Themen 7
B ASCII-Datei einlesen und zerlegen Java Basics - Anfänger-Themen 5
Dilandau string intelligent zerlegen Java Basics - Anfänger-Themen 7
G Wie eine Int Zahl in die einzelnen Ziffern zerlegen? Java Basics - Anfänger-Themen 6
S Zeichenkette zerlegen? Java Basics - Anfänger-Themen 4
G string zerlegen? Java Basics - Anfänger-Themen 3
ven000m Zahl zerlegen Java Basics - Anfänger-Themen 8
frau-u Playlist einlesen, zerlegen und neu sortieren? Java Basics - Anfänger-Themen 3
K Programm in Klassen/Objekte zerlegen - wie? Java Basics - Anfänger-Themen 3
N String zerlegen und auf mehreren Variablen zuweisen Java Basics - Anfänger-Themen 3
B Tastatur eingaben abfragen und dann in Argumente zerlegen..? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben