Ver Mensaje Individual
  #5 (permalink)  
Antiguo 05/11/2004, 09:43
SuperRaskao
 
Fecha de Ingreso: noviembre-2004
Mensajes: 11
Antigüedad: 20 años
Puntos: 0
Te pregunte eso porque hay varias formas de definir "mas cercano posible" una podria ser minimizar la maxima diferencia en el resultado de la suma de dos filas diferentes.

Backtracking es una tecnica de busqueda exaustiva... encontrar todas las permutaciones de un conjunto de numero se puede resolver usando backtracking



para resolver tu problema podrias usar lo siguiente
Código:
class Matrix {
	
	static int [][] M;
	static int [][] R;
	static int [][] T;
	
	static int mejor;
	
	
	static void permutar(int col, int pos, boolean [] U) {
		if(pos == T.length) {
		
			buscar(col + 1);
			return;
		}
		for(int i = 0; i < T.length; ++i) {
			if(U[i])
				continue;
			U[i] = true;
			T[pos][col] = M[i][col];
			permutar(col, pos+1, U);
			U[i] = false;
		}
	}
	
	static void buscar(int col) {
		if(col == T[0].length) {
			int val = evaluar();
		
			if(val < mejor) {
				mejor = val;
				R = new int [T.length][T[0].length];
				R = new int [T.length][T[0].length];
				for(int i = 0 ; i < T.length; ++i)
					for(int j = 0 ; j < T[0].length; ++j)
						R[i][j] = T[i][j];
			}
			return;
		}
		permutar(col, 0, new boolean [T.length]);
			
			
		
	}
	
	
	static int evaluar() {
		int max = Integer.MIN_VALUE;
		int min = Integer.MAX_VALUE;
		for(int i = 0; i < T.length; ++i) {
			int sum  =0;
			for(int j  =0 ; j < T[i].length; ++j)
				sum += T[i][j];
			if(sum > max)
				max = sum;
			if(sum < min)
				min = sum;
			
		}
		return max - min;
		
	}
	
	
	static void imprimir(int [][] M) {
		for(int i = 0  ; i < M.length; ++i, System.out.println())
			for(int j = 0  ; j < M[i].length; ++j)
				System.out.print(" " + M[i][j]);
	}
	public static void main(String [] args) {
		M = new int [][]  {{1, 10, 4, 10},{2, 20 ,30, 3},{10, 3, 5, 9}};
		T = new int [M.length][M[0].length];
		mejor = Integer.MAX_VALUE;
		buscar(0);
		
		
		System.out.println("matriz original: ");
	
		imprimir(M);
	
	
		System.out.println("resultado: ");
		
		imprimir(R);
		
	}
}