HDU - 3466 Proud Merchants(01背包+贪心策略)

题意

给定n个物品和钱数m,每个物品的价格p,限制钱数q,价值v,限制q的意思是你手头的钱必须大于等于q才能购买这个物品,问最后获得的最大价值。

思路

假设两个物品a,b,我们都要买下来,需要的钱至少是pa+pb+max(qa-pa,qb-pb),也就是先买差值最大的,留下来的钱可以满足差值小的的限制价格;
由于动态规划先更新的是子状态,所以要先更新差值小的,也就是qa-pa<qb-pb`在这里插入代码片`

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=505,M=5005;

struct node
{
    int p,q,v;
    bool operator < (const node t)
    {
        return q-p<t.q-t.p;
    }
} a[N];

int dp[M];

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        memset(dp,0,sizeof dp);

        for(int i=0; i<n; i++)
            scanf("%d%d%d",&a[i].p,&a[i].q,&a[i].v);

        sort(a,a+n);

        for(int i=0; i<n; i++)
            for(int j=m; j>=a[i].q; j--)
                dp[j]=max(dp[j],dp[j-a[i].p]+a[i].v);

        printf("%d\n",dp[m]);
    }
    return 0;
}

发布了21 篇原创文章 · 获赞 21 · 访问量 2077

猜你喜欢

转载自blog.csdn.net/qq_44086097/article/details/104223239
今日推荐