All pastes #459302 Raw Edit

philippK

public java v1 · immutable
#459302 ·published 2007-04-26 11:50 UTC
rendered paste body
public class Rucksack implements RucksackProblemSolver {	      	private int[] elements;   	private int[][] matrix;   	private int rucksackSize;	public static void main (String[] args) {		Rucksack rucksack = new Rucksack();		if (args.length < 2) {			System.exit(0);		}		int[] eingabeElemente = new int[args.length - 1];		int[] partition;		for(int i = 0; i < eingabeElemente.length; i++) {			eingabeElemente[i] = Integer.parseInt(args[i]);		}		rucksack.setElements(eingabeElemente);		rucksack.setRucksackSize(Integer.parseInt(args[args.length-1]));		rucksack.buildMatrix();		rucksack.printMatrix();			partition = rucksack.getPartition(13);		System.out.println("Rucksacktest: " + rucksack.test(13));		for (int i = 0; i < partition.length; i++) {			System.out.println("Partitions-Element " + i + ":" + partition[i]);		}	}	public void setElements(int[] elements) {				if (elements == null) {			System.out.println("Nullpointer uebergeben\n Beende Programm!");			System.exit(0);		}					Arrays.sort(elements);				// Ausreichend das erste Element auf < 1 zu testen, da Array sortiert ist.		if (elements[0] < 1) {				System.out.println("Fehler, bitte Eingabeelemente ueberpruefen!");			System.exit(0);		}		this.elements = new int[elements.length];		for(int i = 0; i < elements.length; i++) {			this.elements[i] = elements[i];		}	}	public void setRucksackSize(int r) {		if (r >= 0)		   	rucksackSize = r;		else {		   	System.out.println("Sie haben eine negative Rucksackgroesse uebergeben!");			   	System.exit(0);		}	}		public void buildMatrix() {		matrix = new int[elements.length][rucksackSize + 1];				// Matrixelemente mit -1 initialisieren		for(int i = 0; i < elements.length; i++) {				// Zeilen			for (int j = 0; j < rucksackSize + 1; j++) {			// Spalten				matrix[i][j] = -1;			}		}		// Erste Zeile initialisieren:		matrix[0][0] = 0;	// Rucksack der Groeße 0 immer packbar		if (elements[0] <= rucksackSize)			matrix[0][elements[0]] = 1;	// Rucksack der Groesse erstes Element							// immer packbar inkl. erstem Element		// Restliche Zeilen initialisieren:		for(int i = 0; i < elements.length; i++) {				// Zeilen			for(int j = 0; j < rucksackSize + 1; j++) {			// Spalten				if(matrix[i][j] >= 0 && i < elements.length-1) {	// Wenn in einer Zeile ein Wert >-1 steht					matrix[i+1][j] = 0;				// so muss die Zelle daraunter den Wert 0 haben.					if(j + elements[i+1] <= rucksackSize)								matrix[i+1][j+elements[i+1]] = 1;					}			}		}		}	public boolean test(int rucksackSize) {				//Negative Rucksackgroesse -> Fehler				if (rucksackSize < 0) {			return false;		}		// Matrix noch nicht gebaut, oder 		// uebergebene Rucksackgroeße > momentane Rucksackgroesse		if (matrix[0][0] != 0 || rucksackSize > this.rucksackSize) {			setRucksackSize(rucksackSize);			buildMatrix();		}			return (matrix[elements.length-1][rucksackSize] > -1) ? true						                      : false;	}	public int[] getPartition(int rucksackSize) {				int[] temp_partition = new int[elements.length];		int i = 0;		// Falls sich der Rucksack ueberhaupt packen laesst:				if (test(rucksackSize) == true && rucksackSize > 0) {														// Ruecke bis zu der Zeile vor, in der sich das groesste in den			// Rucksack gehoerende Element befindet:						while (matrix[i][rucksackSize] != 1) {					i++;						}						int j = 0;			while(rucksackSize > 0) {				// Nachdem sich die Rucksackgroesse verkleinert hat ueberpruefe				// ruecke in die Ziele, die das naechste in den Rucksackg gehoerende				// Element enthaelt:								while(matrix[i][rucksackSize] != 1){							i--;								}				temp_partition[j] = elements[i];				rucksackSize -= elements[i];				j++;			}							int[] partition = new int[j];						for (int l = 0; l < j; l++) {				partition[l] = temp_partition[l];			}			Arrays.sort(partition);			return partition;		}		return new int[1];	}	   	public int[][] getMatrix(){		if (matrix[0][0] != 0)			buildMatrix();		   return matrix;	}		   	public void printMatrix() {		// Einfache Ausgabe:		/*		for(int i = 0; i < elements.length; i++) {			for(int j = 0; j < rucksackSize + 1; j++) {				System.out.print(matrix[i][j] + "\t");			}			System.out.println();		}		*/						// Rucksackgroessen printen		System.out.print("\nRucksackgroeße:\t\t");				for(int i = 0; i < rucksackSize + 1; i++) {			System.out.print("\t" + i);		}		// Matrix ausgeben		System.out.println("\n");		for(int i = 0; i < elements.length; i++) {			System.out.print("Elementgroeße: " + elements[i] + "\t");			for (int j = 0; j < rucksackSize + 1; j++) {				System.out.print("\t" + matrix[i][j]);			}			System.out.println();		}	}}