Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7192 | Accepted: 3370 |
Description
Input
Output
Sample Input
3 7 40 3 5 23 8 2 52 6
Sample Output
48
Hint
Source
#include<cstdio> #include<iostream> #include<map> #include<vector> #include<algorithm> #include<set> #include<cstring> using namespace std; typedef pair<int,int> P; const int maxn = 4000 + 5; const int maxm = 40000 + 5; const int INF = 100000 + 1; int dp[2][maxm]; vector<P> v; int main(){ int n,h,a,c; while(scanf("%d",&n) != EOF){ v.clear(); for(int i = 0;i < n;i++){ scanf("%d%d%d",&h,&a,&c); for(int j = 0;j < c;j++){ v.push_back(P(a,h)); } } int total = v.size(); sort(v.begin(),v.end()); memset(dp,0,sizeof(dp)); dp[0][0] = 1; if(v[0].first >= v[0].second) dp[0][v[0].second] = 1; for(int i = 1;i < total;i++){ for(int j = 0;j < maxm;j++){ if(j < v[i].second || j > v[i].first) dp[i&1][j] = dp[(i-1)&1][j]; else dp[i&1][j] = dp[(i-1)&1][j] || dp[(i-1)&1][j-v[i].second]; } } int ans = 0; for(int i = 1;i < maxm;i++){ if(dp[(total-1)&1][i] == 1) ans = i; } printf("%d\n",ans); } return 0; }