zoukankan      html  css  js  c++  java
  • hdoj 3466 Proud Merchants(01背包)

    题目链接

         这并不是一题裸的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;
    }
    


  • 相关阅读:
    快学scala习题解答--第五章 类
    从头认识java-18.2 主要的线程机制(2)-Executors的使用
    关于Bootstrap的理解
    Raw-OS源代码分析之idle任务
    Scilab 的画图函数(3)
    HDU2586.How far away ?——近期公共祖先(离线Tarjan)
    Codeforces Round #311 (Div. 2) A,B,C,D,E
    presto访问 Azure blob storage
    Presto集群安装配置
    Presto架构及原理
  • 原文地址:https://www.cnblogs.com/xindoo/p/3595109.html
Copyright © 2011-2022 走看看