tyvj1089 smrtfun

背景

广东汕头聿怀初中 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[105],b[105],f[105][200015],suma = 100000,ans,bg = 100000,inf = 100005;
int main(){
    cin>>n;
    for(int i = 1;i <= n;i++){
        scanf("%d%d",&a[i],&b[i]);
        if(a[i] >= 0) suma += a[i];
    }
    for(int i = 0;i <= bg * 2;i++) f[1][i] = -inf;
    f[1][bg+a[1]] = b[1];
    f[1][bg] = 0;
    for(int i = 2;i <= n;i++){
        for(int j = 0;j <= bg * 2;j++){
            f[i][j] = f[i-1][j];
            if(j - a[i] >= 0 && j - a[i] <= bg * 2) f[i][j] = max(f[i][j],f[i-1][j-a[i]] + b[i]);
            if(j >= bg && f[i][j] >= 0) ans = max(ans,j + f[i][j] - bg);
        }
    }
    cout<<ans; 

    return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,f[101][200001];//前i个数sum_a[i]为j的max{sum_b[i]}
int ans,maxa=100000,mina=100000;
int a[1001],b[1001];
int main()
{

    scanf("%d",&n);
    for(int i=0;i<=n;i++)
       for(int j=0;j<=200000;j++)
          f[i][j]=-999999;
    f[0][100000]=0;
    for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
    for(int i=1;i<=n;i++)
    {
       maxa=max(maxa,maxa+a[i]);
       mina=min(mina,mina+a[i]);
       for(int j=200000;j>=0;j--)
          {
               f[i][j]=max(f[i][j],f[i-1][j]);
               if(j-a[i]>=0)f[i][j]=max(f[i][j],f[i-1][j-a[i]]+b[i]);
               if(j>=100000&&f[i][j]>=0)ans=max(ans,j+f[i][j]-100000);
               }
    }
    printf("%d",ans);
    return 0;
    }
时间: 2024-12-10 07:59:36

tyvj1089 smrtfun的相关文章

tyvj[1089]smrtfun

描述 现有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 -5 7 8 -6 6 -3 2 1 -8 -5 输出 8 备注 N <= 100 , |A_i| <= 1000 , |B_i

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734