Pagini recente » Cod sursa (job #1835589) | Cod sursa (job #497926) | Cod sursa (job #2253887) | Cod sursa (job #2730090) | Cod sursa (job #1710421)
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] + " ");
}
*/
}