标签:
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define inf 1000000000 struct Node { int a, b; }node[210]; int dp[210][200010]; //dp[i][j] = sum 表示的是 考虑前i对数 第i对数被选中时 所有的ai和为j时 所有的bi和为sum。 // dp[i][j] = max(dp[i][j], dp[k][sumb]+node[i].b); (0<=k<=i-1); int main() { int n; while(cin >> n) { int suma = 0; for (int i=0; i<n; ++i) { cin >> node[i].a >> node[i].b; suma = max(suma, suma+node[i].a); } suma +=100000; for (int i=0; i<n; ++i) { for (int j=0; j<200010; ++j) { dp[i][j] = -inf; } } dp[0][100000+node[0].a] = node[0].b; int ans = 0; // 讲道理啊,如果ans初始值是-inf,就是75分,如果是0就是100分了。 if (node[0].a >= 0 && node[0].b >= 0) ans = max(ans, node[0].a+node[0].b); for (int i=1; i<n; ++i) { dp[i][node[i].a+100000] = node[i].b; for (int j=0; j<i; ++j) { for (int k=0; k<=suma; ++k) { if (dp[j][k] != -inf) { if (k + node[i].a < 0) continue; dp[i][k+node[i].a] = max(dp[i][k+node[i].a], dp[j][k]+node[i].b); if (k+node[i].a >= 100000 && dp[i][k+node[i].a] >= 0) { ans = max(ans, k+node[i].a-100000+dp[i][k+node[i].a]); } } } } } cout << ans << endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/icode-girl/p/5268341.html