这个题目本质上是一个多重背包

但是有一个限制条件,就是每个物品堆放的高度都有一个最大值,不能超过

刚开始被这个条件吓到了,考虑到用搜索的做法,但是400件物品,搜索无法承受

就又回到dp上面,其实贪心的思想就可以保证最优,那些堆放高度限制低的物品一定是放在底下的

所以先按堆放高度限制升序排序,然后就可以上多重背包了

多重背包的解法:用二进制的思想来拆分物品,使之转化成01背包

#include
#include
#include
using namespace std;
int a[4001][2],lon=0;
int ans[400001];

int max(int a,int b)
{
    if(a>b) return(a);
    return(b);
}

int min(int a,int b)
{
    if(a
    return(b);
}

int main()
{
    int k;
    scanf("%d",&k);
    for(int i=1;i<=k;i++)
    {
        int h,l,c;
        scanf("%d %d %d",&h,&l,&c);
        int tmp=1;
        while(tmp<=c)
        {
            c-=tmp;
            a[++lon][0]=tmp*h;
            a[lon][1]=l;
            tmp*=2;
        }
        if(c)
        {
            a[++lon][0]=c*h;
            a[lon][1]=l;
        }
    }

//    for(int i=1;i<=lon;i++)
//    printf("%d %d\n",a[i][0],a[i][1]);

for(int i=1;i<=lon;i++)
      for(int j=lon;j>=i+1;j--)
      if(a[j][1]
      {
          int tmp=a[j-1][0];
          a[j-1][0]=a[j][0];
          a[j][0]=tmp;
          tmp=a[j-1][1];
          a[j-1][1]=a[j][1];
          a[j][1]=tmp;
      }

memset(ans,0,sizeof(ans));
    ans[0]=1;
    int lonh=0;
    for(int i=1;i<=lon;i++)
    {
        for(int j=min(lonh,a[i][1]-a[i][0]);j>=0;j--)
        if(ans[j])
        {
//            printf("%d %d\n",j+a[i][0],a[i][0]);
            ans[j+a[i][0]]=1;
            lonh=max(j+a[i][0],lonh);
        }
    }
    for(int i=400001;i>=0;i--)
    if(ans[i])
    {
        printf("%d\n",i);
        break;
    }

return 0;
}

pojnbsp;2392nbsp;Spacenbsp;Elevatornbsp;背包相关推荐

  1. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  2. 单调队列多重背包时间复杂度O(vn)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 多重背包问题: 有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件.怎样装才能使背包内的物品总价值最大? 网 ...

  3. 浅说——九讲背包之01背包

    所谓九讲,也就是: 0/1背包 0/1背包降维 完全背包 多重背包(二进制优化) 混合背包 二维费用背包 分组背包 有依赖的背包 背包的方案总数\背包的具体方案路径 0/1背包: [问题描述](经典) ...

  4. codevs——2894 Txx考试(背包)

    时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Txx是一个成绩很差的人,考试便成了他的噩梦.于是他常在考试时睡觉以打发时间.今 ...

  5. Codeforces Round #104 (Div. 2) E DP(01背包模型) +组和+除法取模求逆元

    题意: 规定只包含4或7的数为幸运数字,给定n个数的序列,求他的子序列,使得该子序列的长度为k并且满足该子序列中不存在相同的两个幸运数字.问一共寻在多少种可能.(只要该数的下标不同则认为是不同的序列) ...

  6. HDU-1203 I NEED A OFFER!-0、1背包及空间优化

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. 0-1背包使用一维dp数组时为何v要从大到小枚举

    样例数据 5 8 3 5 1 2 2 4 5 2 1 3 如若不然,也就是让v按照从小到大的顺序枚举,就会出现 注意高亮的那一行,第一件物品的重量只有3,怎么会得到6呢? 代码如下 #include& ...

  8. poj 2063完全背包

    题意:给出总资金和投资年份 ,n个股票 给出股票价格和其一年的利润.问如何选择能获得最大利润. 思路:股票可以重复选择,完全背包问题,完全背包也是从01背包衍生而行的,其主要区别在于中间那层循环的次序 ...

  9. codechef ANUCBC(背包)

    题目链接: https://www.codechef.com/problems/ANUCBC 按模数进行背包 取模不要直接取,分开写,不然会T #include<cstdio> #incl ...

最新文章

  1. 内核函数输出怎么看到_谈谈如何学习Linux内核
  2. 显示乱七八糟图片问题之解决
  3. CGI,BOA配置心得
  4. python内置函数——sorted、filter、map、format
  5. 腾讯首位T17级科学家诞生!
  6. MySQL-InnoDB引擎
  7. mysql md5版本校验_MySQL查询以名称的md5版本更新所有条目?
  8. 【Java】关键词assert的使用
  9. 5月22日晚间,阿里巴巴集团发布2020财年业绩……
  10. 遍历列表python_python中列表的遍历
  11. redis的简单安装和配置文件的参数
  12. Oracle 12导出、导入数据
  13. halcon学习笔记——(6)单摄像机标定
  14. Tomcat乱码解决方法
  15. 机器学习----高斯过程回归
  16. 折腾笔记-做网线+二层傻瓜交换机部署
  17. 典型C内存空间分布图
  18. excel下拉让函数参数部分不变
  19. html设置长宽高代码_html设置高等于宽
  20. Eureka健康检查

热门文章

  1. 联想拯救者Y7000P触摸板无法使用
  2. Hbase的数据切分
  3. 在iOS设备上安装Windows、Linux等操作系统!
  4. 8_21_2013_Problem B: SUME_太水
  5. STM32开发笔记03---Bit-Banding
  6. (滁院20级计科专用)期末考试复习-操作系统
  7. 阿里云迁移工具推荐最佳实践:Xen虚拟化迁移到阿里云
  8. 快递鸟智选物流API对接流程
  9. 读书笔记-别做正常的傻瓜
  10. 《现代控制系统》第五章——反馈控制系统性能分析 5.3 二阶系统的性能