hdu 3466 Proud Merchants (01背包好题)

本文介绍了一种改进的01背包问题解决方案,通过特定的排序技巧优化物品选择过程,使得在考虑额外约束的情况下仍能高效求解最大价值。

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

题目:点击打开链接

题意:

普通的01背包,多了一个q,现在剩余钱数大于q是才能买这个。p,v分别为花费和价值。

思路:

这也比较难想,其实放两个物品,需要的空间不只是p1+p2,如果先放1,需要q1+p2,先放2,需要p1+q2。

所以要先对这个排下序。

(这个排序很智能啊,这怎么实现的,我这么写也能排好)

#include<bits/stdc++.h>
using namespace std;

int dp[10001];
struct node{
    int p,q,v;
}t[501];

bool cmp(node a,node b){
    return a.p+b.q>a.q+b.p;
}
int main(){
    int n,m;
    while(cin>>n>>m){
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            cin>>t[i].p>>t[i].q>>t[i].v;
        sort(t+1,t+1+n,cmp);
        for(int i=1;i<=n;i++)
            for(int j=m;j>=t[i].p&&j>=t[i].q;j--)
                dp[j]=max(dp[j],dp[j-t[i].p]+t[i].v);
        cout<<dp[m]<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值