zoukankan      html  css  js  c++  java
  • PKU--2184 Cow Exhibition (01背包)

    分析:给定N头牛,每头牛都有各自的Si和Fi
    从这N头牛选出一定的数目,使得这些牛的
    Si和Fi之和TS和TF都有TS>=0 FS>=0并TS+FS
    达到最大值。
    这是一个背包问题。可以将Si和Fi一个当作是
    背包容量,另一个当作是价值。 
    但是-1000<=Si<=1000出现了负值,采用的处理方式
    一共100组数,从-1000到1000,那么体积的范围就是-100*1000到100*1000。
    平移之后我们要处理的数据范围就在0到200000,新的原点变成100000。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>

    using namespace std;

    const int INF=0X3F3F3F3F;

    int N,s[110],f[110],dp[200010];
    int n;

    int ZeroOnePack()
    {
      memset(dp,-INF,sizeof(dp));
      dp[100000]=0;

      for(int i=1;i<=N;i++)
      {
        if(s[i]>0)
        {
          for(int j=200000;j>=s[i];j--)
            dp[j]=max(dp[j],dp[j-s[i]]+f[i]);
        }
        else
        {
          for(int j=0;j-s[i]<=200000;j++)
            dp[j]=max(dp[j],dp[j-s[i]]+f[i]);
        }
      }

      int ans=-INF;
      for(int j=100000;j<=200000;j++)
        if(dp[j]>=0)  //这个判断重要
          ans=max(ans,dp[j]+j-100000);

      return ans;
    }

    int main()
    {
      while (scanf("%d",&N)!=EOF)
      {
        n=0;
        for(int i=1;i<=N;i++)
           scanf("%d%d",&s[i],&f[i]);

        printf("%d ",ZeroOnePack());
      }
      return 0;
    }





  • 相关阅读:
    gulp安装
    ssh公钥自动登陆
    Laravel 依赖注入原理
    mac添加环境变量
    get和post的区别
    CPU进程与线程的关系和区别
    微信支付开发+{ping++}微信支付托管
    git学习笔记
    消除 activity 启动时白屏、黑屏问题
    转:android中APK开机自动运行
  • 原文地址:https://www.cnblogs.com/gt123/p/3474258.html
Copyright © 2011-2022 走看看