HDU 3466 Proud Merchants 条件限制01背包

比如A:p1 q1, B:p2 q2,

然后,假设单独买A或者B的话,都是可以买到的。

这时,若先买A,则你至少需要p1+q2的钱;
若先买B,则至少需要p2+q1的钱。那肯定是花最少的钱咯,
所以如果先买A再买B,那么p1+q2<p2+q1,转换一下,
就是q1-p1>q2-p2,也就是说qi-pi大的先买。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include<iostream>
#include <algorithm>
using namespace std;
#define MAXN 100*111
#include <queue>
#include <vector>
#define IN freopen("in.txt","r",stdin);
int dp[6000];
struct node
{
    int p,q,v;
}a[555];
int n,m;
bool cmp(node a,node b)
{return a.q-a.p<b.q-b.p;}
int main()
{
  // IN;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        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,cmp);
        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;
}


posted @ 2014-08-04 21:43  kewowlo  阅读(130)  评论(0编辑  收藏  举报