链接:
http://poj.org/problem?id=2184
代码:
1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <queue> 5 #include <stack> 6 #include <cstdio> 7 #include <string> 8 #include <vector> 9 #include <cstdlib> 10 #include <cstring> 11 #include <sstream> 12 #include <iostream> 13 #include <algorithm> 14 #include <functional> 15 using namespace std; 16 #define rep(i,a,n) for (int i=a;i<n;i++) 17 #define per(i,a,n) for (int i=n-1;i>=a;i--) 18 #define all(x) (x).begin(),(x).end() 19 #define pb push_back 20 #define mp make_pair 21 #define lson l,m,rt<<1 22 #define rson m+1,r,rt<<1|1 23 typedef long long ll; 24 typedef vector<int> VI; 25 typedef pair<int, int> PII; 26 const ll MOD = 1e9 + 7; 27 const int INF = 0x3f3f3f3f; 28 const int MAXN = 2e5 + 7; 29 // head 30 31 int n; 32 int s[110], f[110]; 33 int dp[MAXN]; 34 35 int main() { 36 int n; 37 cin >> n; 38 rep(i, 1, n + 1) cin >> s[i] >> f[i]; 39 rep(i, 0, MAXN) dp[i] = -INF; 40 dp[100000] = 0; 41 rep(i, 1, n + 1) { 42 if (s[i] < 0 && f[i] < 0) continue; 43 if (s[i] > 0) { 44 per(j, s[i], 200001) if (dp[j - s[i]] > -INF) 45 dp[j] = max(dp[j], dp[j - s[i]] + f[i]); 46 } 47 else { 48 rep(j, s[i], s[i] + 200001) if (dp[j - s[i]] > -INF) 49 dp[j] = max(dp[j], dp[j - s[i]] + f[i]); 50 } 51 } 52 int ans = 0; 53 rep(i, 100000, 200001) if (dp[i] >= 0) 54 ans = max(ans, dp[i] + i - 100000); 55 cout << ans << endl; 56 return 0; 57 }