This question sorts Q-P from small to large. An intuitive example is given:
4 20
5 15 20
8 12 19
2 16 21
9 11 13
Change of DP in each row after sorting by Q-P
0 0 0 0 0 0 0 0 0 13 13 13 13 13 13 13 13 13 13 13 13
0 0 0 0 0 0 0 0 0 13 19 19 19 19 19 19 32 32
0 0 0 0 0 0 0 0 0 13 19 19 20 33 39 39 39
0 0 0 0 0 0 0 0 0 13 19 19 20 40 41 54 60 60
Change of no sort DP
0 0 0 0 0 0 0 0 0 0 0 0 0 20 20 20 20 20
0 0 0 0 0 0 0 0 0 0 19 19 19 20 20 20 20 20 20
0 0 0 0 0 0 0 0 0 0 19 19 19 20 40 41 41 41 41
0 0 0 0 0 0 0 0 0 13 19 19 20 40 41 41 41 41
Obviously, 8 12 19 is ignored if no sorting is performed.
5 15 20 is updated from DP [10]
8 12 19 is updated from DP [4]
2 16 21 is updated from DP [12]
9 11 13 is updated from DP [3]
#include<iostream>#include<stdio.h>#include<algorithm>using namespace std;struct node{int p,q,v;}a[505];int dp[5005];bool cmp(node a,node b){return a.q-a.p<b.q-b.p;}int main(){int n,m,p,q,v;while(cin>>n>>m){for(int i=0;i<n;i++){scanf("%d%d%d",&a[i].p,&a[i].q,&a[i].v);}for(int i=0;i<=m;i++)dp[i]=0;sort(a,a+n,cmp);for(int i=0;i<n;i++){for(int j=m;j>=a[i].q;j--)dp[j]=max(dp[j-a[i].p]+a[i].v,dp[j]);}int ans=0;for(int i=0;i<=m;i++){if(dp[i]>ans)ans=dp[i];}cout<<ans<<endl;}}