PKU--2184 Cow Exhibition (01背包)
2013-12-14 13:15 gongti 阅读(207) 评论(0) 编辑 收藏 举报分析:给定N头牛,每头牛都有各自的Si和Fi
从这N头牛选出一定的数目,使得这些牛的
Si和Fi之和TS和TF都有TS>=0 FS>=0并TS+FS
达到最大值。
这是一个背包问题。可以将Si和Fi一个当作是
背包容量,另一个当作是价值。
但是-1000<=Si<=1000出现了负值,采用的处理方式
一共100组数,从-1000到1000,那么体积的范围就是-100*1000到100*1000。
平移之后我们要处理的数据范围就在0到200000,新的原点变成100000。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0X3F3F3F3F;
int N,s[110],f[110],dp[200010];
int n;
int ZeroOnePack()
{
memset(dp,-INF,sizeof(dp));
dp[100000]=0;
for(int i=1;i<=N;i++)
{
if(s[i]>0)
{
for(int j=200000;j>=s[i];j--)
dp[j]=max(dp[j],dp[j-s[i]]+f[i]);
}
else
{
for(int j=0;j-s[i]<=200000;j++)
dp[j]=max(dp[j],dp[j-s[i]]+f[i]);
}
}
int ans=-INF;
for(int j=100000;j<=200000;j++)
if(dp[j]>=0) //这个判断重要
ans=max(ans,dp[j]+j-100000);
return ans;
}
int main()
{
while (scanf("%d",&N)!=EOF)
{
n=0;
for(int i=1;i<=N;i++)
scanf("%d%d",&s[i],&f[i]);
printf("%d\n",ZeroOnePack());
}
return 0;
}