hierbas locas
tema de fondo
Esta edición, titulada Loco NOIP2005 tercera pregunta de la popularidad del grupo. Este LiYuxiang conmemorativa titulada nacido.
título Descripción
LiYuxiang era un niño dotado, su sueño es llegar a ser médico más grande del mundo. Con este fin, quería adorar en las proximidades del médico de mayor prestigio como maestro. Médico con el fin de determinar sus calificaciones, le dio un problema. Los médicos lo llevó a una cueva en todas partes hierbas le dijeron:
"Mi hijo, esta cueva tiene algunos diferentes tipos de hierbas, cada una de las cuales la minería va a llevar algún tiempo, cada uno de los cuales tiene su propio valor. Yo te daré algún tiempo, durante este tiempo, se puede recoger algunas hierbas Si eres un chico inteligente, usted debe ser capaz de hacer que el valor total de las hierbas tomadas al máximo ".
Si usted es LiYuxiang, puede realizar esta tarea?
Este problema es diferente y título original:
- Cada loco recolección de hierbas ilimitada.
- El tipo de drogas deslumbrante, hierbas para un buen tiempo, ¡ah! También lo son el crisantemo maestro agradecido!
Formatos de entrada y de salida
Formato de entrada
De entrada de la primera línea tiene dos enteros T (1 <= T <= 100.000) y M (1 <= M <= 10 000), separados por un espacio, y T representa un tiempo total se puede utilizar hierbas, M para cueva el número de años de medicina a base de hierbas. líneas Siguiente M que comprenden cada uno dos números enteros entre 1 y 10000 (incluyendo 1 y 10000) representan, respectivamente, el valor de un cierto tiempo de Recogida de hierbas y la hierba.
Formato de salida
línea de salida, que contiene un solo número entero que representa dentro del período de tiempo prescrito, se puede adoptar a un valor máximo total de hierbas.
entrada y salida de la muestra
Entrada # 1
70 3
71 100
69 1
1 2
Salida # 1
140
Descripción / Consejos
Los datos para 30%, M <= 1000;
Para todos los datos, M <= 10.000, y M * T <10000000 (no contados, 0 7).
Ven LiYuxiang, la primera AC de salir!
análisis
Este problema es una mochila completamente desnuda.
Y la 01
diferencia mochila es una cosa que puede acceder por completo mochila ilimitado. Así que supongo que he reunido \ (n \) sobre las hierbas, entonces la ecuación de transición de estados en este caso debería ser dp[i][j] = dp[i - 1][j - n * v[i]] + n * w[i]
.
Si tomamos toda la ecuación de transición de estados, establece un \ (\ max \) en la que:
dp[i][j] = max(dp[i][j],dp[i - 1][j - n * v[i]] + n * w[i])
.
Pero si es así, la complejidad del tiempo es \ (O (MT ^ T) \) , el alcance de este problema es que los datos \ (M \ Le 10000 \) , \ (T \ Le 100000 \) , por lo que puede utilizar este método T volar.
¿Cómo hacer eso?
En pocas palabras 01
la mochila que circula dentro de j
la orden inverso se puede cambiar. Si usted no sabe 01
unidimensional mochila optimización es la razón por orden inverso, ver escribí esta solución problema .
Entonces, ¿cómo puede esto con 01
algo que ver con ella mochila? Primero 01
mochila dependiente sub-resultado dp[i - 1][j - v[i]]
, porque 01
se selecciona la mochila y no seleccionado sólo dos tipos, lo que la ecuación de transición de estado seleccionado de la corriente no contiene i
elementos. En otras palabras, se redujo a una sola dimensión tiempo para asegurar dp[j - v[i]]
el recorrido inverso, con el fin de garantizar el recorrido dp[j]
de tiempo dp[j - v[i]]
o en el suelo del estado (estado no actualizado).
Pero no es exactamente lo mismo que una mochila, elegir la cantidad de elegir la cantidad de amor, por lo que considerar la adición de una segunda opción de i
tipo de estrategia de productos, es necesario considerar dp[i][j - v[i]]
esta sub-resultados. En otras palabras, la versión de dos dimensiones de la mochila llena, la ecuación de transición de estado para dp[i - 1][j - v[i]]
convertirse en el dp[i][j - v[i]]
. El encogido a unidimensional, atravesada dp[j]
cuando sea necesario para dp[j - v[i]]
ser actualizado. Esto requiere amigos positivos secuencia de salto de ~
Esto es un cambio positivo en el orden inverso. Magia, ¿verdad? Este es el dp
encanto.
código
/*
* @Author: crab-in-the-northeast
* @Date: 2020-03-12 20:54:13
* @Last Modified by: crab-in-the-northeast
* @Last Modified time: 2020-03-13 01:28:22
*/
#include <iostream>
#include <cstdio>
const int maxm = 10005;
const int maxt = 100005;
inline int max(int a,int b) {
return a > b ? a : b;
}
int v[maxm],w[maxm],dp[maxt];
int main() {
int T,M;
std :: cin >> T >> M;
for(int i = 1; i <= M; i++)
std :: cin >> v[i] >> w[i];
for(int i = 1; i <= M; i++)
for(int j = v[i]; j <= T; j++)
dp[j] = max(dp[j],dp[j - v[i]] + w[i]);
std :: cout << dp[T] << std :: endl;
return 0;
}
resultados de la evaluación
RE 44
: R31673389 (razón: Gama de tamaño de la matriz de datos incorrecto ...... ...... confundido)
AC 100
: R31673423 (Este código de aire acondicionado, pero a pesar de un pequeño problema en los términos de tamaño de matriz)
AC 100
: R31680243