Delphi - combinaciones posibles

 
Vista:

combinaciones posibles

Publicado por chelo (8 intervenciones) el 01/06/2010 00:05:29
Hola a todos, les paso a comentar mi problema.
Tengo un valor numerico por un lado (es lo que cobro un negocio) y una tabla con varios valores mas (lo que pagaron los clientes). La idea es buscar conciliar estos valores.

Cobrado Pagado
150 20
23
100
5
45
25

En este caso me tendria que encontrar los valores: 20-100-5-25 que sumandolos se forman los $150
De que manera puedo encontrar esta combinacion?
Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:combinaciones posibles

Publicado por E.T. (1244 intervenciones) el 02/06/2010 17:47:42
Hay qye hacer uso de la recursividad, pero puedo notar que hay mas de un resultado para la suma de 150, por ejemplo 100-5-45
la solucion que te pongo aqui te muestra la primer suma que se pueda hacer para lo cobrado

Declara la siguiente variable en la seccion private

pagado: array of real;

luego agrega la siguiente funcion

function TForm1.BuscaSuma(cobrado, suma2:real; indice:integer; sSalida:string):string;
var suma:real;
i, j:integer;
salida:string;
begin
if indice < length(pagado) then begin
suma := 0;
j:=0;
i:=indice;
salida := '';
while (i < length(pagado)) do begin
suma := suma2 + pagado[i];
salida := sSalida + FloatToStr(pagado[i]) + ' - ';
if (suma = cobrado) then
result := sSalida + FloatToStr(pagado[i])
else if (suma > cobrado) then begin
suma := suma2;
salida := sSalida;
result := BuscaSuma(cobrado, suma, indice + 1 + j, salida);
end else
result := BuscaSuma(cobrado, suma, indice + 1 + j, salida);
inc(j);
inc(i);
if Result <> '' then
i := length(pagado)+2;
end;
end else
Result := '';
end;

ahora para poder usarla, pondrias algo como lo siguiente

procedure TForm1.Button1Click(Sender: TObject);
var cobrado:real;
resultado:string;
begin
cobrado := 150;
SetLength(pagado, 6);
pagado[0]:=20;
pagado[1]:=23;
pagado[2]:=100;
pagado[3]:=5;
pagado[4]:=45;
pagado[5]:=25;
resultado := BuscaSuma(cobrado, 0, 0, '');
ShowMessage(resultado);
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:combinaciones posibles

Publicado por chelo (8 intervenciones) el 02/06/2010 18:06:07
Muchas Gracias!!! Me funciono de maravillas!!!
Ahora me voy a poner a ver la manera de que la busqueda no sea exacta. O sea, en vez de 150 buscar entre 149-151
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar