hdoj 3466 Proud Merchants(01背包)
2013-04-24 09:00
211 查看
题目链接
这并不是一题裸的01背包,它在简单到01背包上还加了一个限制条件Q,如果没有Q,这完全是一题裸01背包。
对于这个题目,我们只要加上排序对某些物品进行优先处理就好了。
想想我们为什么要排序, 举个简单的例子,如果数据中出现这样到情况 5 9 3、 6 6 5、5 6 3…… 对5 9 3 处理的时候他只能求出dp[9]然后6 6 5只能在dp[9]的基础上继续处理,它要用到dp[6]、dp[7]……,而这些全是零,但这些一直会是0吗?不是在处理5 6 3的时候可以得到这些值,但6 6 5已经被处理了,它再也不会用的这些了,所以怎么得到正确的结果? 如果我们对5 6 3优先处理就不会出现这样到情况了。
要想到只有后面要用的值前面都可以得到,那么才不会出错。设A:5 9 3 B:5 6 3,如果先A后B,则至少需要p1+q2 = 14的容量,如果先B后A,至少需要p2+q1 = 11的容量,那么就是p1+q2 > p2+q1,变形之后就是q1-p1 < q2-p2。所以要针对每个属性的q-p来进行排序。
这并不是一题裸的01背包,它在简单到01背包上还加了一个限制条件Q,如果没有Q,这完全是一题裸01背包。
对于这个题目,我们只要加上排序对某些物品进行优先处理就好了。
想想我们为什么要排序, 举个简单的例子,如果数据中出现这样到情况 5 9 3、 6 6 5、5 6 3…… 对5 9 3 处理的时候他只能求出dp[9]然后6 6 5只能在dp[9]的基础上继续处理,它要用到dp[6]、dp[7]……,而这些全是零,但这些一直会是0吗?不是在处理5 6 3的时候可以得到这些值,但6 6 5已经被处理了,它再也不会用的这些了,所以怎么得到正确的结果? 如果我们对5 6 3优先处理就不会出现这样到情况了。
要想到只有后面要用的值前面都可以得到,那么才不会出错。设A:5 9 3 B:5 6 3,如果先A后B,则至少需要p1+q2 = 14的容量,如果先B后A,至少需要p2+q1 = 11的容量,那么就是p1+q2 > p2+q1,变形之后就是q1-p1 < q2-p2。所以要针对每个属性的q-p来进行排序。
#include <stdio.h> #include <string.h> #include <algorithm> const int maxn = 505; using namespace std; int dp[5005]; struct node { int p, q, v; }a[maxn]; int cmp(node x, node y) { return x.q - x.p < y.q - y.p; } int main() { int n, m; while (scanf("%d %d", &n, &m) !=EOF) { for (int i = 1; i <= n; i++) { scanf("%d %d %d", &a[i].p, &a[i].q, &a[i].v); } memset(dp, 0, sizeof(dp)); sort(a, a+n, cmp); for (int i = 1; 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; }
相关文章推荐
- HDOJ 题目3466 Proud Merchants(需排序的01背包)
- HDOJ 3466 Proud Merchants(贪心 + 01背包)
- hdoj 3466 Proud Merchants(01背包)
- hdoj 3466 Proud Merchants 【DP】【01背包】
- HDOJ 3466 Proud Merchants(01背包)
- HDOJ 3466 Proud Merchants(01背包)
- [HDOJ3466]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背包)
- (step 3.3)hdu 3466(Proud Merchants——01背包变种)
- hdu 3466 Proud Merchants(带限制的01背包)
- hdu 3466 Proud Merchants (01背包)
- HDU3466~Proud Merchants(01背包+贪心)
- HDU 3466 - Proud Merchants(01背包)
- hdu 3466 Proud Merchants(01背包)
- HDU 3466 Proud Merchants(变种01背包 + 无后效性)