题目:poj2184
题意:给出num(num<=100)头奶牛的S和F值(-1000<=S,F<=1000),要求在这几头奶牛中选出若干头,使得在其总S值TS和总F值TF均不为负的前提下,求最大的TS+TF值。
解答:把前面那个变量看成背包的容量。后面的值看成背包的价值。由于背包的容量可能为负值,因此需要将其向右平移100000个单位。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 110;
int value[MAXN];
int weight[MAXN];
int dp[200001];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i = 0;i < n;i++)
scanf("%d%d",&value[i],&weight[i]);
for(int i = 0;i <= 200000;i++)
dp[i] = -INF;
dp[100000] = 0;///
for(int i = 0;i < n;i++)
{
if(value[i] > 0)
{
for(int j = 200000;j >= value[i];j--)
if(dp[j-value[i]] > -INF)
dp[j] = max(dp[j],dp[j-value[i]]+weight[i]);//减完之后变小,所以要逆序
}
else
{
for(int j = 0;j<=value[i]+200000;j++)
if(dp[j-value[i]] > -INF)
dp[j] = max(dp[j],dp[j-value[i]]+weight[i]);//减完之后变大,所以要顺序
}
}
int ans = 0;
for(int i = 100000;i <= 200000;i++)///
if(dp[i]-100000+i>ans && dp[i] >= 0)///
ans = dp[i]-100000+i;
printf("%d\n",ans);
}
return 0;
}