1028 demarcación número entero hdu

"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!" 

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

10 
20

Ejemplo de salida

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 }

 


 
 

Supongo que te gusta

Origin www.cnblogs.com/FengZeng666/p/12663187.html
Recomendado
Clasificación