题意:现有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;
}