Cod sursa(job #1710421)

Utilizator catadumitruCatalin Marius catadumitru Data 28 mai 2016 22:18:13
Problema Sate2 Scor 0
Compilator java Status done
Runda Arhiva ICPC Marime 5.36 kb
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;


public class Main {
	private int N, M, K;
	private int[] v;
	private static int nr_test = 0;
    
    private boolean solutieThreePartition() {
        boolean[][] A;
      
        int sumape3 = 0;
        for (int i=0; i<N; i++) {
			sumape3 += v[i];
		}
    	System.out.println("suma este " + sumape3);
    	System.out.println("suma este " + M);

    	if (M % 3 != 0){
	      System.out.println("REST diferit de 0 ");
            return false;
    	} else
	      System.out.println("REST egal cu 0 ");


    	M /= 3;
		
        A = new boolean[M+1][M+1];
        boolean[][] aux = new boolean[M+1][M+1];
       
        //init dinamica
        A[0][0] = true;
		
        //recurenta dinamica
		for (int i = 0; i < N; i++) {
			for (int j = 0; j <= M; j++) {
				for (int k = j; k <= M; k++) {
					if (A[j][k] == false){
						if (j >= v[i]){
							aux[j][k] = A[j][k] || A[j - v[i]][k];
						}
					
						if (k >= v[i]){
							aux[j][k] = A[j][k] || A[j][k - v[i]];
						}
					 }
				}
			}

			for (int j = 0; j <= M; j++) {
				for (int k = j; k <= M; k++) {
					if (aux[j][k] == true){
						A[j][k] = aux[j][k];
						A[k][j] = A[j][k];
					}
				}
			}	
		}
		
		return A[M][M];
    }

    private boolean solutieFourPartition() {
        boolean[][][] A;
      
	 int sumape4 = 0;
        for (int i=0; i<N; i++) {
			sumape4 += v[i];
		}
    	System.out.println("suma este " + sumape4);
    	System.out.println("suma este " + M);

    	if (M % 4 != 0){
	      System.out.println("REST diferit de 0 ");
            return false;
    	} else
	      System.out.println("REST egal cu 0 ");

    	
    	M /= 4;
		
        A = new boolean[M+1][M+1][M+1];
        boolean[][][] aux = new boolean[M+1][M+1][M+1];
        A[0][0][0] = true;
		
        //recurenta dinamica
		for (int i = 0; i < N; i++) {
			for (int j = 0; j <= M; j++) {
				for (int k = 0; k <= M; k++) {
					for (int l = 0; l <= M; l++) {
						if (A[j][k][l] == false){
							if (j >= v[i]){
								aux[j][k][l] = A[j][k][l] || A[j - v[i]][k][l];
							}
							if (k >= v[i]){
								aux[j][k][l] = A[j][k][l] || A[j][k - v[i]][l];
							}
							if (l >= v[i]){
								aux[j][k][l] = A[j][k][l] || A[j][k][l - v[i]];
							}
						}
					}
				}
			}

			for (int j = 0; j <= M; j++) {
				for (int k = 0; k <= M; k++) {
					for (int l = 0; l <= M; l++) {
						if (aux[j][k][l] == true){
							A[j][k][l] = aux[j][k][l];
							A[k][j][l] = A[j][k][l];
						}
					}	
				}
			}	
		}
		
		return A[M][M][M];
    }

    public static void main(String[] args) {
    	Main threePart = new Main();

		{
			threePart.readData("date" + nr_test + ".in");
			
			threePart.printInputVector();
			
			boolean rez = false;
			switch (threePart.K) {
	            case 3:  
	            	rez = threePart.solutieThreePartition();
	    			break;
	            case 4:
	            	rez = threePart.solutieFourPartition();
	            	break;
			}            
	        
			//solutie
			if (rez == true){
				writeData("date" + nr_test + ".out", "DA");
				System.out.println("Exista solutie");
			} else {
				writeData("date" + nr_test + ".out", "NU");
				System.out.println("NU exista solutie");
			
			}
			
			//afisare matrice solutie
			//threePart.printSolutie();
		}
    }
    
	private void readData(String filename) {
		BufferedReader br;
	    StringTokenizer st;

	    int i = 0;
	 	try {
	        //br = new BufferedReader(new InputStreamReader(System.in));
	        br = new BufferedReader(new InputStreamReader(
	        		new FileInputStream(filename)));
	        		
			st = new StringTokenizer(br.readLine());
        	N = Integer.parseInt(st.nextToken());
        	M = Integer.parseInt(st.nextToken());
        	K = Integer.parseInt(st.nextToken());

	        v = new int[N];
			st = new StringTokenizer(br.readLine());
	        while (st.hasMoreElements()) {
	        	v[i++] = Integer.parseInt(st.nextToken());
	        }
	        
	    	br.close();
	    	
	    	System.out.println(N + " " + M + " " + K + " ");
		} catch (Exception e) {
			e.printStackTrace();
		}	
	}

	private static void writeData(String filename, String str) {
	    try {
			//PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
	    	PrintWriter out = new PrintWriter(new BufferedOutputStream(
					new FileOutputStream(filename)));
	    	out.write(str);
		    out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void printInputVector() {
    	System.out.println("Vectorul de intrare are dimensiune " + N);
    	System.out.println("si componentele");
		for (int i=0; i<N; i++) {
			System.out.print(v[i] + " ");
		}
		System.out.println("");
	}
	
	/*
	private void printMatrix() {
    	System.out.println("\n####### Solutia este ##########");
        for (int i = 0; i < sumape3+1; i++){ 
        	for(int j = 0 ; j < sumape3+1; j++)
    			System.out.print(M[i][j] + " ");
        	System.out.println();
        }
        
        //for (int i = 0; i < N; i++)
		//	System.out.print(partitii[i] + " ");
	}
	*/

}