hdoj 3466 Proud Merchants(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优先处理就不会出现这样到情况了。

题目链接


    这并不是一题裸的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;
}
目录
相关文章
|
6月前
|
Java
hdu-2112-HDU Today(dijkstra + map)
hdu-2112-HDU Today(dijkstra + map)
23 0
hdoj 2191 背包
虽然每件物品的数目并不是1,可能有多个,但我们完全可以把这个题目转化成01背包来解决。 可以把多件相同的物品合并成一件,马上就变01背包了。
35 0
hdoj 3555 BOMB(数位dp)
hdoj 3555 BOMB(数位dp)
37 0
hdu 1196 Lowest Bit(水题)
hdu 1196 Lowest Bit(水题)
41 0
codeforces 339A.Helpful Maths B.Xenia and Ringroad 两水题
.题意就是把字符串里面的数字按增序排列,直接上代码。
40 0
poj 2362 hdoj 1518 Square(搜索)
不难了解,小棒子的长度越长,其灵活性越差。例如长度为5的一根棒子的组合方式要比5根长度为1的棒子的组合方式少,这就是灵活性的体现。
49 0
HDOJ 1056 HangOver(水题)
HDOJ 1056 HangOver(水题)
100 0
HDOJ 1056 HangOver(水题)
HDOJ 2012 素数判定
HDOJ 2012 素数判定
123 0
|
机器学习/深度学习 人工智能 BI
HDOJ/HDU 2550 百步穿杨(注意排序)
HDOJ/HDU 2550 百步穿杨(注意排序)
106 0