tyvj1089 smrtfun

时间:2021-07-27 14:56:56

背景

广东汕头聿怀初中 Train#2 Problem3

描述

 现有N个物品,第i个物品有两个属性A_i和B_i。在其中选取若干个物品,使得sum{A_i + B_i}最大,同时sum{A_i},sum{B_i}均非负(sum{}表示求和)。

输入格式

    第一行,一个整数,表示物品个数N。
    接下来N行,每行两个整数,表示A_i和B_i。

输出格式

一个整数,表示最大的sum{A_i + B_i}。

测试样例1

输入


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

输出

8

备注

 N <= 100 , |A_i| <= 1000 , |B_i| <= 1000
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[],b[],f[][],suma = ,ans,bg = ,inf = ;
int main(){
cin>>n;
for(int i = ;i <= n;i++){
scanf("%d%d",&a[i],&b[i]);
if(a[i] >= ) suma += a[i];
}
for(int i = ;i <= bg * ;i++) f[][i] = -inf;
f[][bg+a[]] = b[];
f[][bg] = ;
for(int i = ;i <= n;i++){
for(int j = ;j <= bg * ;j++){
f[i][j] = f[i-][j];
if(j - a[i] >= && j - a[i] <= bg * ) f[i][j] = max(f[i][j],f[i-][j-a[i]] + b[i]);
if(j >= bg && f[i][j] >= ) ans = max(ans,j + f[i][j] - bg);
}
}
cout<<ans; return ;
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,f[][];//前i个数sum_a[i]为j的max{sum_b[i]}
int ans,maxa=,mina=;
int a[],b[];
int main()
{ scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=;j++)
f[i][j]=-;
f[][]=;
for(int i=;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
for(int i=;i<=n;i++)
{
maxa=max(maxa,maxa+a[i]);
mina=min(mina,mina+a[i]);
for(int j=;j>=;j--)
{
f[i][j]=max(f[i][j],f[i-][j]);
if(j-a[i]>=)f[i][j]=max(f[i][j],f[i-][j-a[i]]+b[i]);
if(j>=&&f[i][j]>=)ans=max(ans,j+f[i][j]-);
}
}
printf("%d",ans);
return ;
}

相关文章