这是01背包问题(我觉得题目挺好的),但是问题在于在动态规划前一定要先排序,排序规则是按照q-p由小到大的顺序排列,至于为什么这样排列,有几个博主写了:
HDU 3466 Proud Merchants DP 分享排序方式的证明
先上代码:
struct Ce
{
int p,q,v;
}ce[555];
int cmp(Ce x,Ce y){
return x.q-x.p<y.q-y.p;
}
int main(){
int n,m,i,j;
while(scanf("%d %d",&n,&m)){
for(i = 0; i<n; i++)
scanf("%d%d%d",&ce[i].p,&ce[i].q,&ce[i].v);
int dp[2020] = {0};
sort(ce,ce+n,cmp);
for(i = 0; i<n; i++){
for(j = m; j>=ce[i].q; j--){
dp[j] = max(dp[j],dp[j-ce[i].p]+ce[i].v);
}
}
printf("%d\n",dp[m]);
}
return 0;
}
lz的理解是:动态规划首先要做的就是将dp [ ] 从最小开始填满,所以要从q-p最小开始,故需要先将q-p最小的放在最前面(这样dp[ j - ce[ i ].p ] 每次都能有值用来比较到底需不需要加ce[ i ]。即在买完ce[ i ]之后, j - ce[ i ].p 还能不能继续用来买新的货物。)
不吃晚饭还重了的lz敬上