[2020.10.28SSLユニバーサルシミュレーショントーナメントT2] [SMRTFUN] [DP01バックパックバリアント]

トピックの背景

Luo Guの最初の質問
牛は、彼らが賢くて面白いことを証明したいと思っています。このため、ベッシーは乳牛博覧会を準備し、N頭の牛にインタビューし、各牛のIQとEQを決定しました。

タイトル説明

ベッシーは、展示会に参加する牛を選択する権利があります。負のIQまたはEQは負の影響を引き起こす可能性があるため、Bessieは、牛のIQの合計がゼロ未満またはEQの合計がゼロ未満になることを望んでいません。これらの2つの条件が満たされている場合、彼女は展示されている牛のIQとEQの合計が大きいほど良いことを望んでいます。ベッシーがこの最大値を見つけるのを手伝ってください。

入力フォーマット

•最初の行:単一の整数N、1≤N≤400

•N + 1行の2行目:i + 1行には2つの整数があります。SiとFiは、i番目の牛のIQとEQを表します。-1000≤Si;Fi≤1000

出力フォーマット

•単一の整数:EQとIQの最大合計を表します。Bessieは、牛を展示会に参加させることはできません。これが最善の方法である場合、出力0

サンプルの入力と出力

#1を入力してください

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

出力#1

8

指示/ヒント

最初の牛、3番目の牛、4番目の牛を選択します。IQの合計は-5 + 6 + 2 = 3で、EQの合計は7-3 + 1 = 5です。2頭目の牛を追加すると、合計が10に増える可能性がありますが、心の知能指数と合計が負になるため、許可されません。

分析

この質問は01バックパックと見なすことができます。牛ごとに2つの選択肢があります。
まず、状態を表す方法を検討します。
dp [j]最初のi牛はforで完成します。

状態遷移方程式?
dp [j] = max(dp [j]、dp [j − s [i]] + f [i])dp [j] = max(dp [j]、dp [j−s [i]] + f [私])d p [ j ]=m a x d p [ j ] d p [ j s [ i ] ]+f [ i ]

初期状態:

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

コードをアップロード

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

おすすめ

転載: blog.csdn.net/dglyr/article/details/109345777