#include<cstdio>
#include<cstring>
#define MAX(x,y) ((x)>(y)?(x):(y))
#define INF 0x3f3f3f3f
int dp[200200],count[200200],ts[200],tf[200];
int main()
{
int n;
scanf("%d",&n);
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&ts[i],&tf[i]);
tf[i]+=1000;
ts[i]+=1000;
sum+=tf[i];
}
for(int i=0;i<=sum;i++)
dp[i]=-INF;
memset(count,0,sizeof(count));
dp[0]=0;
for(int i=1;i<=n;i++)
{
for(int j=sum;j>=tf[i];j--)
{
if(dp[j-tf[i]]!=-INF)
{
if(dp[j]-count[j]*2000<dp[j-tf[i]]+ts[i]-(count[j-tf[i]]+1)*2000)
{
dp[j]=dp[j-tf[i]]+ts[i];
count[j]=count[j-tf[i]]+1;
}
}
}
}
int res=0;
for(int i=sum;i>=0;i--)
{
if(dp[i]-count[i]*1000>=0&&i-count[i]*1000>=0)
{
res=MAX(res,i+dp[i]-count[i]*2000);
}
}
printf("%d\n",res);
}
poj 2184 01背包,求体积和重量(有负数)之和最大。
最新推荐文章于 2021-05-07 16:19:38 发布