2009-01-13 6 views
11

De ProjectEuler.net:(ProjectEuler) Suma Combinaciones

Prob 76: ¿De cuántas maneras diferentes pueden cien escribirse como una suma de al menos dos números enteros positivos?

No tengo ni idea de cómo empezar ... ¿algún punto en la dirección correcta o ayuda? No estoy buscando cómo hacerlo, pero algunos insinúan sobre cómo hacerlo.

Por ejemplo 5 se puede escribir como:

4 + 1 
3 + 2 
3 + 1 + 1 
2 + 2 + 1 
2 + 1 + 1 + 1 
1 + 1 + 1 + 1 + 1 

Así 6 posibilidades total.

+0

En realidad, tengo una idea, pero no sé cómo poner esa idea en una forma programable. – Devoted

+0

Parece que ya has encontrado una forma. Intuitivamente has determinado un método recursivamente enumerable. En realidad, usar recursividad te daría una solución bastante elegante. Tenga en cuenta que al concatenar todas las formas en que puede agregar 3 y todas las formas de sumar 2, ha determinado varias formas de agregar 5 – BobbyShaftoe

+0

, el título podría ser un poco más específico :-) –

Respuesta

38

Partition Numbers (o funciones de partición) son la clave para éste.

Problemas de este tipo suelen ser más fáciles si comienzas desde abajo y sigues subiendo para ver si puedes detectar algún patrón.

  • P (1) = 1 = {1}
  • P (2) = 2 = {[2], [1 + 1]}
  • P (3) = 3 = {[3 ], [2 + 1], [1 + 1 + 1]}
  • P (4) = 5 = {[4], [3 + 1], [2 + 2], [2 + 1 + 1] , [1 + 1 + 1 + 1]}
  • P (5) = 7 ...
  • P (6) = 11 ...
  • P (7) = 15 ...
  • P (8) = 22 ...
  • P (9) = 30 ...

Consejo: Ver si se puede construir P ​​(N) a partir de una combinación de los resultados anteriores a P (N).

+0

esto parece –

+0

Tengo que amar los números [párrafo 3 - P (10^3) = 190569292] –

4

Una buena manera de acercarse a ellos es no obsesionarse en el '100', pero trate de considerar cuál es la diferencia entre el total de una suma n y n + 1 sería, mediante la búsqueda de patrones de medida que n aumenta 1,2,3 ....

que tendría un ir ahora, pero tengo trabajo que hacer :)

1

Aviso: Mis matemáticas son un poco oxidado pero espero que esto le ayudará ...

Usted está yendo bien con su desglose del problema.

que en general:

  • Un número n se puede escribir como (n-1) 1 o (n-2) +2
  • generalizar esto a (nm) + m
  • Recuerde que el anterior también se aplica a todos los números (incluyendo m)

Así que la idea es encontrar el primer conjunto (digamos que 5 = (5-1) 1) y luego tratar (5-1) como un nuevo n ... 5 = 4 +1 ... 5 = ((4-1) +1) +1. La que está agotada empieza nuevamente en 5 = 3 + 2 ... que se convierte en 5 = ((3-1) +1) +2 .... = 2 + 1 + 2 ... rompiendo cada uno a medida que avanza.

2

Al igual que la mayoría de los problemas en Project Euler con grandes números, la mejor manera de pensar en ellos es no confundirse con ese enorme límite superior, pensar en el problema en términos más pequeños y progresar gradualmente. Tal vez, en el camino, reconozca un patrón, o aprenda lo suficiente como para obtener la respuesta fácilmente.

La única otra pista que creo que puedo darle sin estropear su epifanía es la palabra 'partición'.

Una vez que haya averiguado, lo tendrás en ningún momento :)

2

un enfoque es pensar función recursiva: encontrar permutaciones de una serie numérica extraída de los números enteros positivos (duplicados permitidos) que se suman a 100

  • es 1, es decir, el cero para el número 1 hay cero soluciones
  • la unidad es 2, es decir, para el número 2 que sólo hay una solución

otro enfoque es pensar función generativa: comience con el cero y busque la serie de permutación hasta el objetivo, manteniendo un mapa/hash o los valores intermedios y cuenta

puede iterar desde 1, o recurse desde 100; obtendrás la misma respuesta de cualquier manera. En cada punto podría (para una solución ingenua) generar todas las permutaciones de la serie de enteros positivos contando hasta el número objetivo menos 1, y contar solo los que se suman al número objetivo

¡buena suerte!

23

La solución se puede encontrar usando un algoritmo de corte.

uso, por ejemplo, el 6. Entonces tenemos:

6 
5+1 
4+2 
3+3 

pero no hemos terminado todavía.

Si tomamos el 5 + 1, y consideramos que la parte +1 está terminada, todas las demás combinaciones finales son manejadas por 4 + 2 y 3 + 3. Entonces tenemos que aplicar el mismo truco al 5.

4+1+1 
3+2+1 

Y podemos continuar. Pero no sin pensar. Porque, por ejemplo, 4 + 2 produce 3 + 1 + 2 y 2 + 2 + 2. Pero no queremos el 3 + 1 + 2 porque tendremos un 3 + 2 + 1. Por lo que sólo utilizamos todas las producciones de 4, donde el número más bajo es mayor o igual que 2.

6 
5+1 
    4+1+1 
    3+1+1+1 
     2+1+1+1+1 
     1+1+1+1+1+1 
    2+2+1+1 
    3+2+1 
4+2 
    2+2+2 
3+3 

siguiente paso es poner esto en un algoritmo.

Ok, necesitamos una función recursiva que tenga dos parámetros.El número a ser cortado y el valor mínimo:

func CountCombinations(Number, Minimal) 
    temp = 1 
    if Number<=1 then return 1 
    for i = 1 to Floor(Number/2) 
    if i>=Minimal then 
     temp := temp + CountCombinations(Number-i, i) 
    end for 
    return temp 
end func 

Para comprobar el algoritmo:

C(6,1) = 1 + C(5,1) + C(4,2) + C(3,3) = 11, which is correct. 
C(5,1) = 1 + C(4,1) + C(3,2) = 7 
C(4,1) = 1 + C(3,1) + C(2,2) = 5 
C(3,1) = 1 + C(2,1) = 3 
C(2,1) = 1 + C(1,1) = 2 
C(1,1) = 1 
C(2,2) = 1 
C(3,2) = 1 
C(4,2) = 1 + C(2,2) = 2 
C(3,3) = 1 

Por cierto, el número de combinaciones de 100:

CC(100) = 190569292 
CC(100) = 190569291 (if we don't take into account 100 + 0) 
+8

Creo que el OP estaba pidiendo pistas, no la respuesta en sí. – Tim

+0

¿Puede ayudarme con esto usando PHP? Porque no sé qué es este lenguaje de programación y especialmente qué significa: – Sedz

1

Muchos problemas de matemáticas puede ser resuelto por induction. Conoce la respuesta para un valor específico, y puede encontrar la respuesta para cada valor, si encuentra algo que enlaza n con n+1.

Por ejemplo, en su caso, usted sabe que la respuesta es ¿Cuántas maneras diferentes se pueden escribir como una suma de al menos dos enteros positivos? es solo 1.

¿Qué quiero decir con el enlace entre n y n+1? Bueno, me refiero exactamente a que debe encontrar una fórmula que, si conoce la respuesta para n, encontrará la respuesta para n+1. Luego, llamando recursivamente a esa fórmula, sabrá la respuesta y lo habrá hecho (nota: esta es solo la parte matemática de ella, en la vida real puede encontrar que este enfoque le daría algo demasiado lento para ser práctico, por lo que aún no lo ha hecho - en este caso I piensa que habrá terminado).

Ahora, supongamos que sabe n se puede escribir como una suma de al menos dos enteros positivos? en k maneras diferentes, uno de los cuales sería:

n = a1 + a2 + a3 + ... mañana (esta suma tiene términos m)

Lo que se puede decir de n+1? Ya que solo le gustaría dar pistas, no estoy escribiendo la solución aquí, sino solo lo que sigue. Seguramente tiene las mismas k maneras diferentes, pero en cada una de ellas estará el término +1, una de las cuales sería:

n + 1 = a1 + a2 + a3 + ... am + 1 (esta suma tiene m + 1 términos)

Luego, por supuesto, tendrá otros k posibilidades, como aquellos en los que el último término de cada suma no es el mismo, pero se incrementa en uno, como:

n + 1 = a1 + a2 + a3 + ... (am + 1) (esta suma tiene m términos)

Por lo tanto, hay al menos 2k formas de escribir n+1como una suma de al menos dos enteros positivos. Bueno, hay otros. Descúbrelo, si puedes :-) Y disfruta :-))