[2020.10.28 Tournoi de simulation universelle SSL T2] [SMRTFUN] [variante de sac à dos DP01]

Contexte du sujet

Question originale de Luo Gu Les
vaches veulent prouver qu'elles sont intelligentes et drôles. Pour cette raison, Bessie a préparé une exposition de vaches laitières, elle a interviewé N vaches et déterminé le QI et le QE de chaque vache.

Description du titre

Bessie a le droit de choisir les vaches qui participeront à l'exposition. Parce qu'un QI ou un QE négatifs peuvent avoir des effets négatifs, Bessie ne veut pas que la somme du QI des vaches soit inférieure à zéro, ou la somme des QE inférieure à zéro. Si ces deux conditions sont remplies, elle espère que plus la somme du QI et du QE des vaches exposées est élevée, mieux c'est… Aidez Bessie à trouver ce maximum.

Format d'entrée

• La première ligne: un seul entier N, 1 ≤ N ≤ 400

• La deuxième ligne de la ligne N + 1: Il y a deux entiers dans la ligne i + 1: Si et Fi, représentant le QI et l'EQ de la i-ème vache, −1000 ≤ Si; Fi ≤ 1000

Format de sortie

• Un seul entier: représente la somme maximale de EQ et IQ. Bessie ne peut laisser aucune vache participer à l'exposition, si c'est le meilleur moyen, sortie 0

Exemple d'entrée et de sortie

Entrez # 1

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

Sortie n ° 1

8

Instructions / conseils

Choisissez la première vache, la troisième vache et la quatrième vache. La somme du QI est de −5 + 6 + 2 = 3 et la somme de l’EQ est de 7−3 + 1 = 5. Ajouter la deuxième vache peut augmenter la somme à 10, mais comme l'intelligence émotionnelle et la somme deviennent négatives, ce n'est pas autorisé.

une analyse

Cette question peut être considérée comme un sac à dos 01. Pour chaque vache, il y a deux options ou non.
Considérons d'abord comment représenter l'État.
dp [j] Les premières vaches i sont complétées par for.

Équation de transition d'état?
dp [j] = max (dp [j], dp [j - s [i]] + f [i]) dp [j] = max (dp [j], dp [j − s [i]] + f [je])d p [ j ]=m a x ( d p [ j ] ,d p [ j - s [ i ] ]+f [ i ] )

Etat initial:

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

Télécharger le code

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

Je suppose que tu aimes

Origine blog.csdn.net/dglyr/article/details/109345777
conseillé
Classement