2755: La magia de bolsillo (recursivo, programación dinámica)

 

límite de tiempo total: 
10000ms
 
Límite de memoria: 
65536kB
descripción
Hay un bolsillo mágico, el volumen total fue de 40, con algunas variaciones de este artículo bolsillos, el volumen total de estos elementos debe ser de 40. John ahora hay n elementos a obtener, un volumen de cada artículo son A . 1 , A 2 ...... A n . John puede seleccionarse de algunos de estos elementos, si se selecciona el volumen total del objeto 40, a continuación, utilizar el bolsillo magia, John estos artículos puede ser obtenido. La pregunta ahora es, ¿Cuántas John diferentes formas de seleccionar elementos.
entrada
La primera línea de entrada es un número entero positivo n (1 <= n <= 20), indica el número de artículos diferentes. Los siguientes n líneas, cada línea tiene un entero positivo entre 1 y 40, se les da una . 1 A, 2 ...... A n valores.
exportación
El número de elementos diferentes de modo de selección de salida.
entrada de la muestra
3 
20 
20 
20
Ejemplo de salida
3
1  // Método a: el número de elementos recursivos y volumen Objeto n array a [100] para las variables globales;
 2  // COUNT (i, SUM) representa el número de combinaciones desde el inicio de la i-ésima de vuelta matriz para estadísticas y suma del número de tipos,
 3.  // suma y combinación de números es: COUT (I, suma) = COUT (. I + 1, sum-a [I]) + COUT (. I + 1, sum),
 . 4  // en el que cout (i + 1, SUM- a [i]) representa contiene a [i], es decir, desde la primera i + 1 siguiente número de recuento
 5  // número y combinación de suma-a [i] es el número de tipo, y cout (i + 1, suma) indica no comprende a [i], es decir, a partir del número i + 1 combinación en adelante estadística de los números y el número de tipos de ******** suma *************************** 
. 6 #include <la iostream>
 7.  el uso de  espacio de nombres STD;
 . 8  
9.  int A [ 100 ];
 10  int n- = . 1 ;
 . 11  int COUNT (int I, int suma) {
 12 es      SI (suma == 0 ) {
 13 es          retorno  1. ;    // encontrar un conjunto de suma y el número de combinación; 
14      }
 15      IF (I == n-sum || < 0 ) devuelven  0 ; // I == ningún otro n-número de instrucciones se combinan, sum <0 indicar que no una combinación; 
16      retorno COUNT (I + . 1 , a-sUM [I]) + COUNT (I + 1. , sUM); // de la matriz i es empecé, que comprende A [i], y no incluye; 
. 17  }
 18 es  
19.  int main () {
 20 es      el tiempo (CIN >> n-) {
 21 es         para ( int i = 0 ; i <n; i ++ )
 22              cin >> a [i];
23          tribunal << contar ( 0 , 40 ) << endl;
24      }
 25      de retorno  0 ;
26 }
1  // Método dos: dinámico de programación 
2 #include <la iostream>
 . 3  el uso de  espacio de nombres STD;
 . 4  #define N 100
 . 5  int n-, A [N];
 . 6  int main () {
 7.      El tiempo (CIN >> n-) {
 8.          Int (DP *) [ 50 ] = new new  int [N] [ 50 ]; // DP [i] [j] indica el i-ésimo elemento en el volumen frente Couchu J; 
. 9          para ( int i = 1. ; i <= N-; ++ I ) {
 10              CIN >> A [I];
 . 11              DP [I] [0 ] = 1 ; // 初始边界
12          }
 13          dp [ 0 ] [ 0 ] = 1 ;
14          para ( int i = 1 ; i <= n; i ++ )
 15              para ( int j = 1 ; j <= 40 ; j ++ ) {
 16                  dp [i] [j] = dp [i- 1 ] [j];
17                  si (a [i] <= j)
 18                      dp [i] [j] + = dp [i- 1 ] [j- a [i]];
19              }
20          cout << dp [n] [ 40 ] << endl;
21          delete [] dp;
22      }
 23      de retorno  0 ;
24 }

 

Supongo que te gusta

Origin www.cnblogs.com/aiqinger/p/12599557.html
Recomendado
Clasificación