zoukankan      html  css  js  c++  java
  • Cow Exhibition

    poj2184:http://poj.org/problem?id=2184

    题意:给你n头牛,每头牛有一个S值和一个F值,现在的问题是,要你选出其中的一些牛求出S+T的最大值。但是要保证总的s>=0和F>=0
    题解:可以把s作为体积,然后利用0,1背包。求出每个s做对应的最大的F值,然后for一遍,求出最大的f+s。因为有负的值出现,所以把 背包的容量加上一个100000;因为过程中s的值可以是小于0的,for的时候从100000开始即可,不是很好理解。

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<string.h>
     4 #include<algorithm>
     5 using namespace std;
     6 const int INF=0x3f3f3f3f;
     7 const int MAXN=110;
     8 int dp[200010];
     9 int value[MAXN];
    10 int weight[MAXN];
    11 int nKind;
    12 int main()
    13 {
    14     int k=100000;
    15     while(scanf("%d",&nKind)!=EOF){
    16         for(int i=0;i<nKind;i++){
    17             scanf("%d%d",&value[i],&weight[i]);
    18         }
    19         for(int i=0;i<=200000;i++)dp[i]=-INF;
    20         dp[k]=0;
    21         for(int i=0;i<nKind;i++){
    22             if(value[i]>0)//正的是逆序
    23         {
    24                 for(int j=200000;j>=value[i];j--)//注意范围
    25                   if(dp[j-value[i]]>-INF)
    26                     dp[j]=max(dp[j],dp[j-value[i]]+weight[i]);
    27             }
    28             else//负的是顺序
    29             {
    30                 for(int j=0;j<=200000+value[i];j++)//注意范围
    31                   if(dp[j-value[i]]>-INF)
    32                     dp[j]=max(dp[j],dp[j-value[i]]+weight[i]);
    33             }
    34         }
    35         int ans=0;
    36         for(int i=100000;i<=200000;i++)
    37             if(dp[i]>=0&&dp[i]+i-100000>ans)
    38                 ans=dp[i]+i-100000;
    39         printf("%d
    ",ans);
    40     }
    41     return 0;
    42 }
    View Code
  • 相关阅读:
    Solr的中英文分词实现
    乐观锁与悲观锁
    Keepalived + nginx实现高可用性和负载均衡
    Heartbeat实现集群高可用热备
    mongoDB 使用手册
    LVS+keepalived负载均衡
    keepalived工作原理和配置说明
    微信设置URL之WebApi方式
    RabbitMQ Windows下安装问题解决
    JSOM 中对各种字段操作
  • 原文地址:https://www.cnblogs.com/chujian123/p/3402093.html
Copyright © 2011-2022 走看看