您的位置:首页 > 其它

poj2184解题报告

2015-06-27 09:26 204 查看
来源: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: