Https://vjudge.net/contest/150953#problem/D
The key is the sort, just start by Q sort of results want to die can not think of it should be q-p platoon
One-dimensional DP
#include <map>#include<Set>#include<list>#include<cmath>#include<queue>#include<stack>#include<vector>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#definell Long Longusing namespacestd;Const intmaxn=505, n=5005;intDp[n];structedge{intP,q,v,c;} E[MAXN];intCompConstEdge &a,ConstEdge &b) { returna.c<B.C;}intMain () {intt,n,w; while(~SCANF ("%d%d",&n,&W)) {memset (DP,0,sizeof(DP)); for(intI=0; i<n;i++) {cin>>e[i].p>>e[i].q>>e[i].v; E[I].C=e[i].q-E[I].P; } sort (E,e+N,comp); for(intI=0; i<n;i++) for(intj=w;j>=e[i].q;j--) {Dp[j]=max (dp[j],dp[j-e[i].p]+e[i].v); } cout<<dp[W]<<Endl; } return 0;}
Two-dimensional DP
#include <map>#include<Set>#include<list>#include<cmath>#include<queue>#include<stack>#include<vector>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#definell Long Longusing namespacestd;Const intmaxn=505, n=5005;intDp[maxn][n];structedge{intP,q,v,c;} E[MAXN];intCompConstEdge &a,ConstEdge &b) { returna.c<B.C;}intMain () {intt,n,w; while(~SCANF ("%d%d",&n,&W)) {memset (DP,0,sizeof(DP)); for(intI=0; i<n;i++) {cin>>e[i].p>>e[i].q>>e[i].v; E[I].C=e[i].q-E[I].P; } sort (E,e+N,comp); for(intI=0; i<n;i++) for(intj=w;j>=0; j--) { if(J>=E[I].Q) dp[i+1][j]=max (dp[i][j],dp[i][j-e[i].p]+e[i].v); Elsedp[i+1][j]=Dp[i][j]; } cout<<dp[n][W]<<Endl; } return 0;}/*2 1010-5 7 3511*/
01 Backpack Sorting