http://acm.hdu.edu.cn/showproblem.php?pid=1881
01 背包 先按发起人离开的时间从小到大排序
然后再套01背包的模板
#include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <cstdio> #include <cstdlib> #include <math.h> #include <ctype.h> using namespace std; #define memset(a,b) memset(a,b,sizeof(a)) #define N 200 #define INF 0xfffffff typedef long long ll; struct node { int h,l,t,k; }a[N]; int dp[N]; int cmp(node x,node y) { return x.t<y.t; } int main() { int n; while(scanf("%d",&n),n>=0) { int Max=0; for(int i=0;i<n;i++) { scanf("%d %d %d",&a[i].h,&a[i].l,&a[i].t); a[i].k=a[i].t-a[i].l; Max=max(Max,a[i].t); } sort(a,a+n,cmp); memset(dp,0); int ans=0; for(int i=0;i<n;i++) { for(int j=a[i].t;j>=a[i].l;j--) { dp[j]=max(dp[j],dp[j-a[i].l]+a[i].h); ans=max(ans,dp[j]); } } printf("%d ",ans); } return 0; }