HDU3466——Proud Merchants

本文探讨了01背包问题中的一种特殊排序方法,通过按照收益-成本之差的顺序排列物品来优化动态规划过程。文章提供了详细的代码实现,并解释了这种排序方式背后的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值