hdu Proud Merchants

此题是一个背包的题目,刚开始我并没有作任何的排序工作,所以出来的结果总是错的,仔细想想也确实是不对的,因为q[i]会限制dp[i]的值的变化。虽然我知道要按照某个量进行排序,对原数据进行处理,但是实在是想不到到底要处理那个数据。于是看了一下大神的博客,原来是要对q-p进行从小到大的排序。对于原因我也是不太懂。。。

#include"iostream"
#include"stdio.h"
#include"cmath"
#include"algorithm"
#include"string.h"
using namespace std;
#define mx 5005
int dp[mx];
struct node
{
    int p,q,v,l;
}thing[mx];
bool cmp(const node a,const node b )
{
    if(a.l!=b.l) return a.l<b.l;
}
int main()
{
    int n,m,i,j,k;
    while(scanf("%d%d",&n,&m)==2)
    {
        for(i=1;i<=n;i++)
           {
                cin>>thing[i].p>>thing[i].q>>thing[i].v;
                thing[i].l=thing[i].q-thing[i].p;
           }
           sort(thing+1,thing+n+1,cmp);
           memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
        {
            if(thing[i].q>m) continue;
            for(j=m;j>=thing[i].q;j--)
            {
                if(dp[j]<dp[j-thing[i].p]+thing[i].v)
                    dp[j]=dp[j-thing[i].p]+thing[i].v;
            }
        }
        cout<<dp[m]<<endl;
    }
    return 0;
}
View Code

 

posted @ 2015-03-04 22:31  Run_For_Love  阅读(85)  评论(0编辑  收藏  举报