[2020.10.28 Torneo de simulación universal SSL T2] [SMRTFUN] [Variante de mochila DP01]

Antecedentes del tema

Pregunta original de Luo Gu Las
vacas quieren demostrar que son inteligentes y divertidas. Por esta razón, Bessie ha preparado una exposición de vacas lecheras, ha entrevistado a N vacas y ha determinado el coeficiente intelectual y el coeficiente intelectual de cada vaca.

Descripción del Título

Bessie tiene derecho a elegir qué vacas participar en la exposición. Debido a que el coeficiente intelectual o el coeficiente intelectual negativos pueden causar efectos negativos, Bessie no quiere que la suma del coeficiente intelectual de las vacas sea menor que cero, o que la suma del coeficiente intelectual sea menor que cero. Si se cumplen estas dos condiciones, espera que cuanto mayor sea la suma del coeficiente intelectual y el coeficiente intelectual de las vacas en exhibición, mejor. Ayude a Bessie a encontrar este máximo.

Formato de entrada

• La primera línea: un número entero N, 1 ≤ N ≤ 400

• La segunda línea de la línea N + 1: Hay dos números enteros en la línea i + 1: Si y Fi, que representan el IQ y EQ de la i-ésima vaca, −1000 ≤ Si; Fi ≤ 1000

Formato de salida

• Un solo entero: representa la suma máxima de EQ e IQ. Bessie no puede dejar que ninguna vaca participe en la exposición, si esta es la mejor forma, salida 0

Entrada y salida de muestra

Ingrese # 1

5
-5 7
8 -6
6 -3
2 1
-8 -5

Salida # 1

8

Instrucciones / consejos

Elija la primera vaca, la tercera vaca y la cuarta vaca. La suma de IQ es −5 + 6 + 2 = 3, y la suma de EQ es 7−3 + 1 = 5. Agregar la segunda vaca puede aumentar la suma a 10, pero como la inteligencia emocional y la suma se vuelven negativas, no está permitido.

análisis

Esta pregunta se puede considerar como una mochila 01. Para cada vaca, hay dos opciones o no.
Primero, considere cómo representar al estado.
dp [j] Las primeras i vacas se completan con for.

¿Ecuación de transición de estado?
dp [j] = max (dp [j], dp [j - s [i]] + f [i]) dp [j] = max (dp [j], dp [j − s [i]] + f [yo])d p [ j ]=m a x ( d p [ j ] ,d p [ j - s [ i ] ]+f [ i ] )

Estado inicial:

memset(dp,0x3f, sizeof(dp)); //负无穷
dp[400000] = 0;

Subir código

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

int n,s[1001],f[1001],d[500001],ans;

int main()
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++)
	{
    
    
		cin>>s[i]>>f[i];
	} 
	memset(d,-0x3f,sizeof(d));
	d[100000]=0;
	for(int i=1;i<=n;i++)
	{
    
    
		if(s[i]>=0)
		{
    
    
			for(int j=2*100000;j>=s[i];j--)
			{
    
    
				d[j]=max(d[j],d[j-s[i]]+f[i]);
			}
		}
		else
		{
    
    
			for(int j=0;j<=2*100000+s[i];j++)
			{
    
    
				d[j]=max(d[j],d[j-s[i]]+f[i]);
			}
		}
	}
	for(int i=100000;i<=2*100000;i++)
	{
    
    
		if(d[i]>0)
		{
    
    
			ans=max(ans,i+d[i]-100000);
		}
	}
	cout<<ans;
	return 0;
} 

Supongo que te gusta

Origin blog.csdn.net/dglyr/article/details/109345777
Recomendado
Clasificación