トピックの背景
タイトル
牛は、彼らが賢くて面白いことを証明したいと思っています。このため、ベッシーは乳牛博覧会を準備し、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 0∗1つの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;
}