poj2184解题报告

来源:互联网 发布:淘宝评价内容可以改吗 编辑:程序博客网 时间:2024/05/19 15:20
来源:http://poj.org/problem?id=2184

题意:有一些奶牛,他们有一定的s值和f值,这些值有正有负,最后让保证s的和为非负且f的和为非负的情况下,s+f的最大值。

解题思路:有两种价值,最开始我以为是二维背包,不过后来看到1e5的范围,二维数组肯定开不了,所以转换为0,1背包,两种状态的上界都不定,估计个最大值,全搜出来,然后在比较。

注意点:1.开一维数组的话,当s大于0时,循环逆序,当s小于0时,循环正序

                 2.因为状态(数组的维度)可负,所以用1e6这个状态来表示0;低于它为负数,高于它为正数

                 所以初始化需要dp[1000000]=0;

上下界要估计好

#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>using namespace std;const int maxn=2*1e6+10;const int INF=-(1<<30);int dp[maxn];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<=200000;i++)        dp[i]=INF;        dp[100000]=0;        int a,b;        for(int i=1; i<=n; i++)        {            scanf("%d%d",&a,&b);            if(a<0&&b<0) continue;//直接不用它            if(a>0)                for(int j=200000; j-a>=0; j--)                {                    if(dp[j-a]>INF)                        dp[j]=max(dp[j-a]+b,dp[j]);                }            else            {                for(int j=a; j<=200000+a; j++)//取好上界                {                    if(dp[j-a]>INF)                        dp[j]=max(dp[j-a]+b,dp[j]);                }            }        }        int ans=INF;        for(int j=100000; j<=200000; j++)        {            if(dp[j]>=0) ans=max(ans,dp[j]+j-100000);        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击