[2020.10.28SSLシミュレーショントーナメントT2] [Luogu P2340] SMRTFUN [01バリエーションのバックパック]

トピックの背景

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

タイトル説明

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

入力フォーマット

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

•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

分析:

牛ごとに選択できるかどうかしかわからないので、0101に変換できます。0 1バックパックの質問
としてEQに関して値、IQとしてボリュームがあってもよい
DP [I] [J] DP [I] [J]d p [ i ] [ j ]は前者のiiですIQとして牛があるJJj最大EQ値
。IQ値はすることができますが、添え字を負にすることはできないため全体1000 ∗ 100 1000 * 100だけ戻す必要があることに注意してください1 0 0 01つの0 0ビットは、
それが最大値を見つけることであるためIQ EQをし、最終的にするためのDP [n]は[I] + I DP [n]は[I] + Id p [ n ] [ i ]+最大値を取ることができます

コード:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define reg register 
using namespace std;
const int N=100005;
const int LIMIT=100000;
int n,s[105],f[105],dp[105][N],ans;
int main(){
    
    
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&s[i],&f[i]);
	memset(dp,-0x3f,sizeof(dp));
	dp[0][0]=0;dp[0][LIMIT]=0;
	for(reg int i=1;i<=n;i++)
		for(reg int j=2*LIMIT;j>0;j--)  //从-1000*100~1000*100 -> 0~2000*100 
			dp[i][j]=max(dp[i-1][j],dp[i-1][j-s[i]]+f[i]);  //取或不取
	for(int i=LIMIT;i<=2*LIMIT;i++)  //在这个范围取最大 
		if(dp[n][i]>=0)
			ans=max(ans,dp[n][i]+i-LIMIT);  //记得原本值要减 100*1000 
	printf("%d",ans);		
	
	return 0;
}

おすすめ

転載: blog.csdn.net/dgssl_xhy/article/details/109340304