此题是一个背包的题目,刚开始我并没有作任何的排序工作,所以出来的结果总是错的,仔细想想也确实是不对的,因为q[i]会限制dp[i]的值的变化。虽然我知道要按照某个量进行排序,对原数据进行处理,但是实在是想不到到底要处理那个数据。于是看了一下大神的博客,原来是要对q-p进行从小到大的排序。对于原因我也是不太懂。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include"iostream" #include"stdio.h" #include"cmath" #include"algorithm" #include"string.h" using namespace std; #define mx 5005 int dp[mx]; struct node { int p,q,v,l; }thing[mx]; bool cmp(const node a,const node b ) { if(a.l!=b.l) return a.l<b.l; } int main() { int n,m,i,j,k; while(scanf("%d%d",&n,&m)==2) { for(i=1;i<=n;i++) { cin>>thing[i].p>>thing[i].q>>thing[i].v; thing[i].l=thing[i].q-thing[i].p; } sort(thing+1,thing+n+1,cmp); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { if(thing[i].q>m) continue; for(j=m;j>=thing[i].q;j--) { if(dp[j]<dp[j-thing[i].p]+thing[i].v) dp[j]=dp[j-thing[i].p]+thing[i].v; } } cout<<dp[m]<<endl; } return 0; }