4120: Monedas (programación dinámica)

 

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/50285203

1 #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 }

 

Supongo que te gusta

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