"Bueno, parece que el primer problema es demasiado fácil. Voy a hacerle saber qué tonto eres después." dice feng5166.
"El segundo problema es, dado un número entero positivo N, definimos una ecuación como esta:
N = a [1] + a [2] + a [3] + ... + a [m];
a [i]> 0,1 <= m <= N;
Mi pregunta es cuántos diferentes ecuaciones se pueden encontrar para un determinado N.
por ejemplo, supongamos que n es 4, podemos encontrar:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
por lo que el resultado es 5 cuando N es 4. Obsérvese que "4 = 3 + 1" y "4 = 1 + 3" es el misma en este problema. Ahora, lo haces!"
"El segundo problema es, dado un número entero positivo N, definimos una ecuación como esta:
N = a [1] + a [2] + a [3] + ... + a [m];
a [i]> 0,1 <= m <= N;
Mi pregunta es cuántos diferentes ecuaciones se pueden encontrar para un determinado N.
por ejemplo, supongamos que n es 4, podemos encontrar:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
por lo que el resultado es 5 cuando N es 4. Obsérvese que "4 = 3 + 1" y "4 = 1 + 3" es el misma en este problema. Ahora, lo haces!"
Entrada
La entrada contiene varios casos de prueba. Cada caso de prueba contiene un número entero positivo N (1 <= N <= 120) que se menciona anteriormente. La entrada es terminada por el final del archivo.
Salida
Para cada caso de prueba, que tiene a la salida de una línea contiene un número entero P que indican las diferentes ecuaciones que ha encontrado.
Ejemplo de entrada
4
10
20
Ejemplo de salida
5
42
627
pensamiento
partición Supongamos (n, m): n es un número entero positivo división en todo número de la división sumando menos de o igual a m.
En circunstancias normales, se encuentran:
partición (n, m) = partición (n, m-1) + partición (nm, m);
Por ejemplo:
Por ejemplo partición (7,4) = partición (7,3) + partición (3,4), ¿por qué añadiría partición (3,4) que?
4 + 3, + 4 + 4 + 2 + 1 + 1 número total de esta línea es 1 partición (3,4),
4 es equivalente a una parte superior fija eliminado, las entradas restantes será igual al número total de 7-4 = 3, pero los elementos restantes sumando menos de 4, tal como el número de filas suprimidas 4 en la parte posterior.
circunstancias especiales (condición de terminación recursiva):
(1) partición (n, m) = partición (n, n-1) + 1
Cuando n <= m, con una partición (n, m) = partición (n, n-1) + 1, n no se divide ya que no es mayor que n sumando
(2) partición (1, n) = 1
Cuando n = 1, no importa cuán grande es el m, tienen solamente una división de enteros 1
(3) partición (n, 1) = 1
Para cualquier número entero n, menor o igual sumando 1 sólo una división, es decir, 1 + 1 + 1 + ....
Memoria de optimización de búsqueda utilizando la recursividad, para dar el siguiente código:
1 #include <iostream> 2 #include <vector> 3 #include <stdio.h> 4 #include < string > 5 6 usando espacio de nombres std; 7 8 #define MAXN 150 9 10 vector <vector < int >> memo; 11 12 int partición ( int n, int m) 13 { 14 si (n < 1 || m < 1 ) 15 de retorno 0 ; 16 17 si (n == 1 || m == 1 ) 18 de retorno 1 ; 19 20 Si (memo [n] [m] = - 1 ) 21 de retorno memo [n] [m]; 22 23 si (n <= m) 24 memo [n] [m] = 1 + partición (n, n- 1 ); 25 más 26 memo [n] [m] = partición (n, m- 1 ) + partición (n- m, m); 27 28 retorno memo [n] [m]; 29 30 } 31 32 intmain () 33 { 34 int n; 35 , mientras que (scanf ( " % d " , y n) =! EOF) 36 { 37 memo = vector <vector < int >> (MAXN, vector < int > (MAXN, - 1 )); 38 printf ( " % d \ n " , la partición (n, n)); 39 } 40 41 de retorno 0 ; 42 }