- límite de tiempo total:
- 1000 ms
- Límite de memoria:
- 262144kB
- descripción
-
El astronauta Bob llegado en Marte un día, él tiene el hábito de la recogida de monedas. Se enfrentará valor de todas las monedas se recogieron en Marte, y un total de n especies tienen cada uno una sola: en denominaciones de A 1 , A 2 ... A n. Bob en el aeropuerto vio un regalo preferido para comprar para un amigo Alice, este regalo es el precio de X dólares. Bob le gustaría saber con el fin de comprar su regalo, que las monedas se van a utilizar, que Bob tiene que renunciar a qué tipo de moneda que recoge buena. Aeropuerto no proporciona el cambio de dar sólo aceptan sólo X dólares.
- entrada
-
La primera línea contiene dos números enteros n y x positivas. (1 <= n <= 200 , 1 <= x <= 10.000)
de la segunda fila para considerablemente pequeño número entero positivo n a1, a2, a3 ... un ( 1 <= EA <= x) - exportación
-
La primera línea es un entero que es cuántas monedas se van a utilizar.
La segunda línea es la denominación de la moneda que se debe utilizar (en orden ascendente). - entrada de la muestra
-
5 18 1 2 3 5 10
- Ejemplo de salida
-
2 5 10
- rápido
-
Los datos de entrada se garantiza una denominación de la moneda dado al menos una combinación simplemente puede pagar $ X.
Debe ser utilizado si la moneda no existe, entonces la primera línea de salida 0, la línea de salida de la segunda línea en blanco. -
Ideas de resolución de problemas: Consideramos a [i] en realidad cumple con el elemento esencial fácil pensar, f [x] -f [xa [i]] es cero, pero el número de esquemas f [xa [i]] También es posible utilizar a [i], por lo que f [xa [i]] - f [xa [i] * 2], es clasificar la f [x] -f [xa [ i]] + f [xa [i] * 2 ], también es muy fácil de encontrar la ley de inclusión-exclusión, la resolución de este modo recursivo, xa límite recursiva [i] * k <0 o f [xa [i] * k ] == 0;
tiempo complejidad de algoritmo
----- -----------
vínculo original: https: //blog.csdn.net/qq_18455665/article/details/502852031 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 usando espacio de nombres std; 5 #define N 205 6 #define M 10005 7 int n, x, l; 8 int a [N], ans [N]; 9 int f [M]; 10 int calc ( int x, int v) { 11 si (x < 0 ) volver 0 ; 12 otra cosa retorno f [x] -calc (x- v, v); 13 } 14 int main () { 15 scanf ( " % d% d " , y n, y x); 16 para ( int i = 1 ; i <= n; i ++) scanf ( " % d " , & a [i]); 17 f [ 0 ] = 1 ; 18 para ( int i = 1 ; i <= n; i ++ ) 19 para ( int j = x; j> = a [i]; j-- ) 20 f [j] + = f [j- a [i] ]; 21 para ( int i =1 ; i <= n; i ++ ) { 22 si ((f [x] -calc (x-! ) {a [i], a [i])) 23 ans [++ l] = a [i]; 24 } 25 } 26 printf ( " % d \ n " , l); 27 para ( int i = 1 ; i <= l; i ++) printf ( " % d " , ans [i]); 28 de retorno 0 ; 29 }