下面的代码只平移了40000,数组也只开了80000,都少了个零,但A了。
#include <bits/stdc++.h>
using namespace std;
#define f(i,a,b) for (int i=a;i<=b;i++)
#define rf(i,a,b) for (int i=a;i>=b;i--)
int n,ans=0xc0c0c0c0,s[410],f[410],dp[80010];
int main () {
cin>> n;
f (i,1,n)
cin>> s[i]>> f[i];
memset (dp,0xc0,sizeof dp);
dp[40000]=0;
f (i,1,n) {
if (s[i]>=0) {
rf (j,80000,s[i])
dp[j]=max (dp[j],dp[j-s[i]]+f[i]);
} else {
f (j,0,80000+s[i])
dp[j]=max (dp[j],dp[j-s[i]]+f[i]);
}
}
f (i,40000,80000)
if (dp[i]>=0)
ans=max (ans,dp[i]+i-40000);
cout<< ans;
return 0;
}