HDU 3466 Proud Merchants 条件限制01背包
2014-08-04 21:43
363 查看
比如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大的先买。
然后,假设单独买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; }
相关文章推荐
- HDU 3466 Proud Merchants 条件限制01背包
- HDU 3466 Proud Merchants(DP:01背包+贪心)
- HDU - 3466 Proud Merchants (01背包的变形 + 贪心)
- HDU - 3466 Proud Merchants (01背包的变形 + 贪心)
- HDU - 3466 Proud Merchants (01背包的变形 + 贪心)
- HDU 3466 Proud Merchants(01背包的应用)
- 01背包水题篇之HDU3466——Proud Merchants
- HDU 3466 Proud Merchants ……(01背包 + 排序(物品的选择有先后顺序))
- hdu 3466 Proud Merchants 自豪的商人(01背包,微变形)
- HDU 3466 Proud Merchants (01背包排序问题)
- hdu-3466 Proud Merchants(01背包之转移)
- HDU - 3466 Proud Merchants (01背包的变形 + 贪心)
- hdu 3466 Proud Merchants (01背包变形)
- HDU--3466--Proud Merchants--01背包
- HDU 3466(Proud Merchants)有条件01背包
- 排序01背包 Problem W:Proud Merchants(HDU 3466)
- HDU - 3466 Proud Merchants (01背包的变形 + 贪心)
- HDU - 3466 Proud Merchants (01背包的变形 + 贪心)
- hdu 3466 Proud Merchants(01 背包)
- HDU - 3466 Proud Merchants (01背包的变形 + 贪心)