洛谷 P2340 [USACO03FALL]Cow Exhibition G(01背包)

每个牛可以拿或者不拿,所以是个01背包。

双商为负的牛肯定不拿。用 f[i]f[i] 表示智商和为 ii 时对应的最高情商和,由于可能出现负数,所以统一移位。

#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 800005
#define MI 400000
#define MX 800000
#define INF 0x3f3f3f3f
using namespace std;
int n,f[MAXN],res=-INF;
struct Node{
    int s,f;
}a[405];
int main(){
#ifdef WINE
    freopen("data.in","r",stdin);
#endif
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d",&a[i].s,&a[i].f);
    memset(f,-0x3f,sizeof(f));
    f[MI]=0;
    for(int i=1;i<=n;i++){
        if(a[i].s<=0&&a[i].f<=0)continue; // 双商为负,要你何用?
        if(a[i].s>=0) // 为保证01背包,因此正数时倒序
            for(int j=MX;j>=a[i].s;j--)
                f[j]=max(f[j],f[j-a[i].s]+a[i].f);
        else          // 负数时正序
            for(int j=0;j<=MX+a[i].s;j++)
                f[j]=max(f[j],f[j-a[i].s]+a[i].f);
    }
    for(int i=MI;i<=MX;i++)
        if(f[i]>=0)res=max(res,f[i]+i-MI);
    printf("%d\n",res);
    return 0;
}
    

posted @ 2020-07-10 14:35  winechord  阅读(98)  评论(0编辑  收藏  举报