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; }