HDU3466——Proud Merchants


这是01背包问题(我觉得题目挺好的),但是问题在于在动态规划前一定要先排序,排序规则是按照q-p由小到大的顺序排列,至于为什么这样排列,有几个博主写了:


HDU 3466 Proud Merchants DP 分享排序方式的证明

HDU3466(背包先后顺序)


先上代码:

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敬上




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值