Red de conocimiento informático - Conocimiento de la instalación - ¡Cuanto más completo sea el algoritmo en Delphi, mejor!

¡Cuanto más completo sea el algoritmo en Delphi, mejor!

1. Algoritmo de teoría de números

1. Encuentra el máximo común divisor de dos números

función gcd(a,b:integer):integer;

begin<. /p> p>

si b=0 entonces gcd:=a

si no gcd:=gcd (b,a mod b);

función lcm:=gcd ( b,a mod b);

2.

end

2. lcm(a, b:integer):integer;

comenzar

si a

lcm:=a;

mientras lcm mod b>0 do inc(lcm,a);

end;

3. Encuentra números primos

A.A. Determinar si un número es números primos en un rango pequeño:

función prima (n: entero): booleano;

var I: entero;

comenzar

for I:=2 to trunc(sqrt(n)) hacer

si n mod I=0 entonces comenzar

prime:=false;

end;

prime:= true;

end;

B Determinar si un número en el rango de enteros largos es primo. número (incluidas tablas de números primos hasta 50.000):

Proceso getprime;

var

i,j:longint;

p :matriz:=verdadero.

Para I:=1 a n hacer

Para j:=w[I] a v hacer F[I, j]:=f[I-1,j-w[I ]];

Optimización: el estado actual solo está relacionado con el estado anterior y se puede reducir a una dimensión.

F[0]:=true;

Para I:=1 a n comenzar

F1:=f;

Para j:=w[I] a v hacer

Si f[j-w[I]] entonces f1[j]:=true;

F:=f1;

F:=f1;

Fin;

B. Encuentra el valor máximo que se puede ingresar.

F[I,j] es el valor máximo que se puede obtener cogiendo las primeras j mochilas cuando la capacidad es I.

F [i,j] = max { f [ i - w [ j ], j-1].+ p [ j ], f[ i,j-1] }

C. Encuentre el número de casos en los que está exactamente lleno.

DP:

Actualización de procedimiento;

var j,k:integer;

comenzar

c: =a;

para j:=0 a n hacer

si a[j]>0 entonces

si j +ahora<=n entonces inc( c[j+now],a[j]);

a:=c;

end;

2. Mochila repetible

A Encuentra el peso máximo que se puede colocar en la mochila.

F[I,j] es un indicador booleano que selecciona algunos de los primeros i elementos para colocarlos de modo que su volumen sea exactamente j.

La ecuación de transición de estado es

f[I,j] = f [ I-1, j - w[I]*k ] (k=1...j dividido por w[I])

B. Encuentre el valor máximo que se puede poner.

USACO 1.2 Inflación de puntaje

Realizar una competencia El tiempo total de la competencia es T fijo. Hay varias preguntas de opción múltiple Las opciones para cada pregunta no están limitadas. cada pregunta Ambos tienen ti (el tiempo requerido para responder la pregunta) y si (el puntaje obtenido al resolver la pregunta). Ahora seleccione una cantidad de preguntas para que el tiempo total para responder estas preguntas sea T o menos, y el puntaje total. Máximo obtenido, encuentre la puntuación máxima.

*Lo más fácil de pensar es:

f[i,j] = max { f [i-*w[j], j-1] + k*p [j] }+ k*p[j] }(0<=k<= i div w[j])

Entre ellos, f[i,j] significa que cuando la capacidad es i, tome los primeros datos j El valor máximo que el paquete puede alcanzar.

*Ejecución:

Inicio

FillChar(f,SizeOf(f),0);

Para i:=1 A M Do

Para j:=1 Para N Do

Si i-problem[j].time>=0 Entonces

Comenzar

t:=problem[j].point+f[i-problem[j].time];

Si t>f[i] Entonces f[i]:=t;

End;

Writeln(f[M]);

End .

C. Encuentra el número de casos en los que está exactamente lleno.

Ahoi2001 Pregunta 2

Encuentra el número de expresiones para la suma de números primos esencialmente diferentes del número natural n.

Idea 1. Generar la disposición de los coeficientes de cada número primo y comprobarlos uno por uno. Este es un método general.

Proceso try(dep:integer);

var i,j: integer;

begin

cal;{Este proceso calcula El coeficiente calculado actualmente, ahora el resultado}

si ahora>n entonces sale; {poda}

si dep=l+1 entonces comienza {generar todos los coeficientes}

cal;

si ahora=n entonces inc(tot);

salir;

end;

para i: =0 a n div pr[dep] comenzar<

xs[dep]:=i;

try(dep+1);

xs[ dep]:=0;

end;

end;

end;

Idea 2, la búsqueda recursiva es más efectiva

Proceso try(dep,rest:

var i,j,x:integer;

comenzar

if (rest<=0) o (dep=l+1) luego comenzar

si rest=0 entonces inc(tot);

salir;

end;.

para i:=0 descansar div pr[dep] do

try(dep+1,rest-pr[dep]*i);

end;

{principal: prueba(1,n }.