Solución del problema cf - E. Slots óptimos

https://codeforces.com/group/5yyKg9gx7m/contest/275848/problem/E

E. Ranuras óptimas

El salón principal de su residencia está abierto para uso de la comunidad local y el público. Dado que fue construido sobre donaciones públicas, no hay ningún cargo por usarlo. Cada fin de semana, especialmente en días festivos, hay hasta 50 reservas para usarlo en múltiples eventos con diferentes duraciones.

Los residentes le han asignado que desarrolle un programa para elegir eventos para aprovechar al máximo el tiempo de asignación por fin de semana y tener el menor tiempo posible sin usar. El programa debe encontrar los eventos que llenen mejor el tiempo de asignación e imprimirlo en la misma secuencia que aparece en la lista de reservas.

Entrada
Cada caso de prueba consta de una sola línea.

La línea comienza con dos números enteros T y N, que es el tiempo asignado para la sala que se utilizará en el fin de semana en particular y el número de eventos. El siguiente entero T son las duraciones de los eventos (como aparecen en la lista de reservas). Por ejemplo, desde la primera línea en los datos de la muestra: T = 5 horas, N, número de eventos = 5, el primer evento dura 1 hora, el segundo son 2 horas, el tercero son 3 horas, el cuarto son 4 horas y el último es 5 horas.

El proceso de entrada será terminado por una línea que contiene 0.

Salida
Para cada línea de valor de entrada, en una sola línea, primero, genera una lista de enteros que son la duración de los eventos seleccionados y otro número entero que es la suma de la duración de los eventos seleccionados.

Si hay varias listas posibles de eventos, los eventos que aparecen antes en la lista tienen prioridad.

Ejemplo de entrada
Copiar
5 5 1 2 3 4 5
10 9 11 9 3 5 8 4 9 3 2
16 8 12 6 11 11 13 1 10 7
13 5 10 12 2 13 10
28 14 18 19 26 15 18 24 7 21 14 25 2 12 9 6
0
salida Copiar
1 4 5
3 5 2 10
6 10 16
13 13
19 7 2 28

 Descripción del título;

Elija entre n números para que su suma sea lo más cercana posible a T. Imprime el número seleccionado. Si hay varios planes, imprima el plan que aparece primero y luego imprima la suma.

Análisis:

Es un simple problema máximo de 01 mochila. T es el costo total y a [i] es el valor. La clave es imprimir la ruta. Presta atención a la salida del primer plan. También hay una plantilla.

Código:

#include <iostream> 
#include <algorithm> 
#include <cstring> 
#include <cstdio> 
#include <sstream> 
#include <vector> 
#include <stack> 
#include <deque> 
#include <cmath> 
#include <map>
 usando el  espacio de nombres estándar; 
typedef largo  largo ll;
const  int maxn = 1e4 + 6 ;
int a [maxn];
int dp [maxn];
int T, n;
ruta bool [maxn] [maxn];
void init () 
{
    memset (dp, 0 , sizeof dp); 
    memset (ruta, 0 , sizeof ruta); 
} 
void solve () 
{ 
    // Contrariamente al método de impresión desde atrás 
    para ( int i = n- 1 ; i> = 0 ; i-- ) 
    { 
        for ( int j = T; j> = a [i]; j-- ) 
        { 
            // Es necesario agregar el signo igual, el esquema que no aparece puede no ser el primero 
            si (dp [j] < = dp [ja [i]] + a [i]) 
            { 
                dp [j] = dp [ja [i]] + a [i]; 
                ruta [i] [j] = 1; 
            } 
        } 
    } 
    int j = T;
    // 从 最先 出现 的 开始 , i: 1 ~ n-1; 
    para ( int i = 0 ; i <n; i ++ ) 
    { 
        if (ruta [i] [j]) 
        { 
            printf ( " % d " , a [i]); 
            j - = a [i]; 
        } 
    } 
    printf ( " % d \ n " , T- j); 
} 
int main () 
{ 
    while ( 1 ) 
    { 
        init (); 
        cin >>T;
        si (T == 0 ) se rompe ; 
        cin >> n;
        para ( int i = 0 ; i <n; i ++ ) 
        { 
            scanf ( " % d " , & a [i]); 
        } 
        resolver (); 
    } 
    devuelve  0 ; 
}

 

Supongo que te gusta

Origin www.cnblogs.com/studyshare777/p/12687991.html
Recomendado
Clasificación