P1616 Colección Crazy Medicine (Luogu)

Descripción del título

Li Yuxiang es un niño talentoso y su sueño es convertirse en el mejor médico del mundo. Por esta razón, quería adorar al médico más prestigioso de la zona como su maestro. Para juzgar su aptitud, el médico le presentó un problema difícil. El médico lo llevó a una cueva llena de hierbas y le dijo: "Hijo mío, hay diferentes tipos de hierbas en esta cueva. Se necesita algo de tiempo para elegir cada una, y cada una tiene su propio valor. un período de tiempo durante el cual puedes recolectar algunas hierbas. Si eres un niño inteligente, deberías poder maximizar el valor total de las hierbas que recolectas ".

Si eres LiYuxiang, ¿puedes completar esta tarea?

La diferencia entre esta pregunta y la pregunta original:

  1. Cada hierba se puede recolectar de forma salvaje sin restricciones.
  2. ¡Los tipos de medicamentos son deslumbrantes y el tiempo para recolectar medicamentos es demasiado largo! ¡El maestro estaba esperando el crisantemo para agradecer!

Formato de entrada y salida

Formato de entrada

Hay dos números enteros en la primera línea de entrada, que representan el tiempo total t que se puede usar para recolectar hierbas ym representa el número de hierbas en la cueva.

Las líneas 2 a (m + 1) tienen dos números enteros en cada línea. Los números enteros ai y bi en la línea (i + 1) representan el tiempo para recoger la i-ésima hierba y el valor de la hierba.

Formato de salida

Genere una línea, esta línea solo contiene un número entero, que representa el valor total máximo de hierbas que se pueden recolectar dentro del tiempo especificado.

Entrada y salida de muestra

Ingrese # 1

70 3
71 100
69 1
1 2

Salida # 1

140

Instrucciones / consejos

Escala de datos y convención
Inserte la descripción de la imagen aquí

Ideas:

Referencia de código

#include<bits/stdc++.h>
using namespace std;
long long t[1000001],v[1000001],f[10000001];//t:采某种药所需的时间,v:某种药的价值
int T,m;
int main()
{
    
    
    cin>>T>>m;//t:总时间,M:数目
    for (int i = 1;i <= m;i++)
        cin>>t[i]>>v[i];
    for (int i = 1;i <= m;i++)
        for (int j = t[i];j <= T;j++)
            f[j]=max(f[j],f[j-t[i]]+v[i]);
    cout<<f[T];//输出
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/Bertil/article/details/106759677
Recomendado
Clasificación