dp之01背包hdu3466(带限制的,当你所拥有的钱数大于某个限定值时才可以购买该物品)

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

mark:又是变种01背包,每做一个变种的,就是一种提高。。

按照q - p以由大到小的顺序排序,然后进行01背包的DP即可。

 

#include<stdio.h>

#include<algorithm>

#include<iostream>

using namespace std;

const int MAXN=5005;

int dp[MAXN];

struct Node

{

    int p,q,v;

}node[505];

bool cmp(Node a,Node b)

{

    return  (a.q-a.p)<(b.q-b.p);

}    

int main()

{

    int n,m;

    int i,j;

    int p,q,v;

    while(scanf("%d%d",&n,&m)!=EOF)

    {

        for(i=0;i<=m;i++)

          dp[i]=0;

        for(i=0;i<n;i++)

        {

            scanf("%d%d%d",&node[i].p,&node[i].q,&node[i].v);

        }    

        sort(node,node+n,cmp);

        for(i=0;i<n;i++)

        {

            for(j=m;j>=node[i].p;j--)

            {

                if(j>=node[i].q)

                  dp[j]=max(dp[j],dp[j-node[i].p]+node[i].v);

            }    

        }

        int ans=0;

        for(i=1;i<=m;i++)

          if(ans<dp[i])  ans=dp[i];

        printf("%d\n",ans);

              

    }    

    return 0;

}

 

 

 

你可能感兴趣的:(HDU)