poj-2184Cow Exhibition (01背包 中 负数的处理)

题意:现有n头牛,每头牛各有两个指数:聪明指数S和幸福指数F,如果存在S的和TS>=0与F的和TF>=0同时成立时,则输出TS与TF的和的最大值sum,否则输出0。

思路:0-1背包
1.有了负数的参与,那么我们需要修改DP数组的起始位置,因为考虑到负数的存在,所以DP数组下标 1—mid 为处理负数的区间 mid—N为处理正数的区间
2.初始化的问题,dp整个数组为一个极小值(负数),起始点为0.
3.正负数时候不同的背包

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<cmath>


using namespace std;

const int N = 200005;
const int inf = -0x3f3f3f;
int mid = 100000;
int dp[200005];
int v[111];
int w[111];


int main()
{
    int n;
    cin>>n;
    int i,j;
    for(i=1; i<=n; i++)
    {
        scanf("%d %d",&w[i],&v[i]);
    }
    memset(dp,inf,sizeof(dp));
    dp[100000] = 0;
    for(i=1; i<=n; i++)
    {
        if(w[i]>0)
        {
            for(j=N; j>=w[i]; j--)
            {
                dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
            }
        }
        else
        {
            for(j=0; j<N+w[i]; j++)
            {
                dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
            }
        }
    }
    int res = 0;
    for(i=mid; i<N; i++)
    {
        if(dp[i]>0)
            res = max(res,dp[i]+i-mid);
    }
    cout<<res<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44694282/article/details/90411416