zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    Android 源码阅读之MMS细读TransactionService.java
    [Java2 入门经典]第16章 线程
    Android 源码阅读之建立3G网络流程
    从架构上看Android多媒体播放器
    Android 开发日志之仿三星Launcher
    非常适合OA系统的菜单
    模拟动网当前位置下拉菜单
    模拟windows菜单选项卡效果
    TreeView的各种操作
    ASCII表
  • 原文地址:https://www.cnblogs.com/hyfer/p/5754694.html
Copyright © 2011-2022 走看看