#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<queue>
#include<algorithm>
using namespace std;
#define offset 100010
struct SNode
{
int si,fi;
}node[110];
int dp[300000+10];
bool flag[300000+10];
bool cmp(const SNode a,const SNode b)
{
return a.si <b.si ;
}
int main()
{
int N;
while(scanf("%d",&N)!=EOF){
for(int i=0;i<N;i++){
scanf("%d %d",&node[i].si,&node[i].fi);
// node[i].fi +=offset;
node[i].si +=offset;
}
sort(node,node+N,cmp);
memset(dp,0,300000*sizeof(int));
memset(flag,false,sizeof(flag));
int up=0,k=0;
for(k=0;k<N && node[k].si<=offset;k++){
int si=node[k].si ,fi=node[k].fi;
if( fi<=0)continue;
for(int j=1;j<=up;j++){
if(flag[j]){
printf("-------%d %d--------\n",si-offset,fi);
int n=j+si-offset;
if( fi+dp[j]>0 || !flag[n] )
dp[n]+=fi+dp[j];
flag[n]=true;
up=max(n,up);
}
}
if( fi>0 || !flag[si] )
dp[si]+=fi;
flag[si]=true;
up=max(si,up);
}
for( ;k<N;k++){
int si=node[k].si,fi=node[k].fi ;
if(si-offset+fi<=0)continue;
printf("-------%d %d--------\n",si-offset,fi);
for(int j=up;j>0;j--){
if(flag[j]){
int n=j+si-offset;
if(fi+dp[j]>0 || !flag[n] )
dp[n]+=fi+dp[j];
printf("%d --> %d %d \n",j-offset,n-offset,dp[n]);
flag[n]=true;
up=max(n,up);
}
}
if( fi>0 || !flag[si])
dp[si]+=fi;
flag[si]=true;
up=max(si,up);
}
int ans=0;
for(int i=offset;i<=up;i++){
if(dp[i]>=0 && flag[i]){
printf("%d %d\n",i-offset,dp[i]);
ans=max(ans,i-offset+dp[i]);
}
}
printf("%d\n",ans);
}
return 0;
}
posted on 2009-07-15 21:59
iyixiang 阅读(364)
评论(0) 编辑 收藏 引用 所属分类:
fojpojzojhoj^^^^