Algoritmo de enumeración del proceso de aprendizaje de Xiaojie

Qué es la enumeración, la explicación en la enciclopedia: en la teoría de las matemáticas y la informática, una enumeración de un conjunto es un programa que enumera todos los miembros de un determinado conjunto de secuencias finitas, o un recuento de objetos de un tipo particular. Estos dos tipos a menudo (pero no siempre) se superponen. Es una colección de constantes enteras con nombre. Las enumeraciones son muy comunes en la vida diaria. Por ejemplo, DOMINGO, LUNES, MARTES, MIÉRCOLES, JUEVES, VIERNES y SÁBADO que representan una semana son una enumeración.

Una comprensión simple, la enumeración es una estrategia de resolución de problemas que intenta responder una por una.

Por lo general, tenemos muy buenas formas de resolver problemas, como los métodos matemáticos. Para resolver problemas con métodos matemáticos, a menudo encontramos leyes y formulamos fórmulas. Si la fórmula puede obtener la respuesta directamente, básicamente no hay complejidad de tiempo, por lo que el método matemático es muy claro.

Pero en la vida real, hay muchas reglas que no se pueden seguir. Tuvimos que usar métodos estúpidos para probar uno por uno y ver cuál es la respuesta real.

Por ejemplo: encuentre el número primo más grande menor que N. Este tipo de problema no puede encontrar una fórmula matemática, por lo que el número primo se puede calcular de acuerdo con N. ¿Entonces tenemos que juzgar si N-1 es primo? ¿Es N-2 primo? ...... De esta manera, determine si Ni es primo. Esta es la llamada idea de enumeración.

Aquí hay algunos ejemplos. Las preguntas son todas de Internet.

Ejemplo uno

Cinco yuanes por cada gallo, tres yuanes por cada gallina y un yuan por tres pollos. Compre cien pollos por cien yuanes. ¿Cuántos gallos, gallinas y pollos hay?

Use el método de enumeración para resolver el problema: tome el número de tres tipos de pollos como objetos de enumeración, establezca respectivamente x, y, z, y use el número total de tres tipos de pollos y la cantidad total de pollos como condiciones de juicio para agotar los diversos Numero

x + y + z = 100
5*x + 3*y + z/3 = 100

Análisis 1

Si resolver este problema resolviendo ecuaciones requiere muchas conjeturas, una de las ventajas de las computadoras es que la velocidad de cálculo es particularmente violenta. Por lo que la forma en que usamos el método de fuerza bruta para resolver problemas, 101 necesidad 3 veces a la suposición, pero para un equipo, no hay problema.

Procedimiento 1:

#include <stdio.h>

int main()
{
    int x, y, z;
    
    for( x=0; x <= 100; x++ )
        for( y=0; y <= 100; y++ )
            for( z=0; z <= 100; z++ )
            {
                if( 5*x+3*y+z/3==100 && z%3==0 && x+y+z==100 )
                {
                    printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", x, y, z);
                }
            }

    return 0;
}

Resultado de la operación:

公鸡  0 只,母鸡 25 只,小鸡 75 只
公鸡  4 只,母鸡 18 只,小鸡 78 只
公鸡  8 只,母鸡 11 只,小鸡 81 只
公鸡 12 只,母鸡  4 只,小鸡 84

Mirando hacia atrás en el algoritmo anterior, usamos un bucle de tres capas con una complejidad temporal de o (n 3 ). En la vida real, no usaremos un algoritmo de esta complejidad en absoluto. Entonces, ¿podemos continuar optimizando este algoritmo?

Análisis 2

Traté de analizar la fórmula inicial, dos fórmulas y tres incógnitas. Deberíamos poder determinar el dominio de cada desconocido. Entonces consigo:

x <= 20;
y <= 33;
z <=99;

Procedimiento 2:

#include <stdio.h>

int main()
{
    int x, y, z;
    
    for( x=0; x <= 20; x++ )
        for( y=0; y <= 33; y++ )
            for( z=0; z <= 99; z++ )
            {
                if( 5*x+3*y+z/3==100 && z%3==0 && x+y+z==100 )
                {
                    printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", x, y, z);
                }
            }

    return 0;
}

Aunque esto no cambió la complejidad del tiempo es: O (n- 3. Casos), pero el número de operaciones que 101 de 3. Reducida a 20 33 es 99, aproximadamente quince operación de reducción de seis veces.

Análisis 3

Luego intento de nuevo usar x, y para representar z para reducir el número de ciclos.

z = 100 - x - y;

Procedimiento 3:

#include <stdio.h>

int main()
{
    int x, y, z;
    
    for( x=0; x <= 20; x++ )
        for( y=0; y <= 33; y++ )
        {
            z = 100 - x - y;
            if( 5*x+3*y+z/3==100 && z%3==0)
            {
                printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", x, y, z);
            }
        }
    return 0;
}

Esta vez, solo se utilizaron dos ciclos, y la complejidad del tiempo fue o (n 2 ), lo que redujo directamente el nivel de energía. Y la pregunta cambió directamente de 21 34 100 la última vez a 21 * 34, el número de veces directamente reducido en 100 veces.
Análisis 4

Al hacer problemas en las ecuaciones lineales ternarias de secundaria y preparatoria, generalmente elegiremos la eliminación para resolver el problema, luego podemos eliminar z directamente en este problema.

x + y + z = 1005x + 3y + z/3 = 1003 * ①,得: 
15x + 9y + z = 300   ③
联立②③,得:
(15x + 9y + z = 300- (x + y + z = 100)推出 14x + 8y = 200
解得:y = 25 - (7/4)x  ④
然后我们将④带入原式
y = 25 - (7/4)x
为了消除分母,我们设:x = 4k,则:
x = 4k;
y = 25 - 7k;
z= 100 - x - y = 75 + 3k;
根据分析②:x <= 20 ,y <= 33,z <=99,且三者皆>=0
得:k=1,2,3

Procedimiento 4:

#include <stdio.h>

int main()
{
    int x, y, z,k;
    
    for( k=0; k <= 3; k++ )
    {
        x = 4 * k;
        y = 25 - 7 * k;
        z = 75 + 3 * k;
        printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", x, y, z);
    }
    return 0;
}

De esta manera, resolvimos este problema en un ciclo. La complejidad del tiempo es: o (n). Este problema solo necesita cuatro operaciones, que es lo mismo que las anteriores 101 2 , 21 34 100 y 21 * 34, que es infinitamente más simple.

Por lo tanto, cuando tenemos que usar el método de enumeración, también debemos intentar reducir la cantidad de ejecuciones de programas para mejorar la eficiencia.

Ejemplo dos

Problema cúbico perfecto, descripción del problema: a 3 = b 3 + c 3 + d 3 es la ecuación cúbica perfecta. Por ejemplo, 12 3 = 6 ^ 3 + 8 3 + 10 3 .

Escriba un programa para encontrar todos los cuaterniones (a, b, c, d) para cualquier número entero positivo N (N ≤ 100), de modo que a 3 = b 3 + c 3 + d 3 , donde a> 1, b, c, d≤N.

#include <stdio.h>

int main()
{
    int i,n,a,b,c,d;
    scanf("%d",&n);//输入正整数n 
    for(a=2;a<=n;a++)
       for(b=2;b<=a-1;b++)
         for(c=b;c<=a-1;c++)
           for(d=c;d<=a-1;d++)
                if(a*a*a==b*b*b+c*c*c+d*d*d)
                printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
    return 0;
}

Para este problema, también tratamos de reducir el rango de valores de b, c, d para aumentar la velocidad de operación del programa.

Resultado de la operación:

24
a=6,b=3,c=4,d=5
a=12,b=6,c=8,d=10
a=18,b=2,c=12,d=16
a=18,b=9,c=12,d=15
a=19,b=3,c=10,d=18
a=20,b=7,c=14,d=17
a=24,b=12,c=16,d=20
10 artículos originales publicados · Me gusta0 · Visitas 55

Supongo que te gusta

Origin blog.csdn.net/z55947810/article/details/105582869
Recomendado
Clasificación