¡Cuanto más completo sea el algoritmo en Delphi, mejor!
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 p >
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; p >
{principal: prueba(1,n }.