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
  • 相关阅读:
    毕业季 | 如何做出99分的答辩PPT
    git: error setting certificate verify locations解决办法
    获取表格里面的内容
    MD5加密算法
    mybatis多条件批量删除
    layer.confirm
    DevExpress控件的GridControl实现行多选
    sz与rz命令
    @TableField的使用
    C# WinForm 中Label自动换行 解决方法
  • 原文地址:https://www.cnblogs.com/chujian123/p/3402093.html
Copyright © 2011-2022 走看看