hdu 3466 Proud Merchants 01背包

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3466

题意:买东西,每个东西有三个特征值,p代表价格,q代表你手中钱必须不低于q才能买这个物品,v代表得到的价值,求用手中的钱买到的最大价值。

由于   f[j]=max(f[j],f[j-p[i]]+v[i])   此时 f[j-p[i]] 必须已经被计算过。而对于每个物品i,j-p[i] 最小应该取 q[i]-p[i] 。所以应该对q[i]-p[i]从小到大排序。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 5500

using namespace std;

struct node
{
    int q,p,v;
}a[N];

int d[N];

bool cmp(node a,node b)
{
    return a.q-a.p<b.q-b.p;
}

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=0;i<n;i++)
            scanf("%d%d%d",&a[i].p,&a[i].q,&a[i].v);
        sort(a,a+n,cmp);
        memset(d,0,sizeof(d));
        for(int i=0;i<n;i++)
            for(int j=m;j>=a[i].q;j--)
                d[j]=max(d[j],d[j-a[i].p]+a[i].v);
        cout<<d[m]<<endl;
    }
}


你可能感兴趣的:(dp,ACM,HDU,背包问题,01背包)