这题一个很巧妙的操作就是对一个给定的区间同意将下界拿出来, 然后转化为多重背包问题. 使用二进制优化.

代码如下:

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#define ER 0x80808080
using namespace std;/*
解题:给定一个Multi数组, 一个Pairs数组, 要求出最好的Table的数组. 其中应满足这个几个要求, 首先sum{ Table[i]*Multi[i] } = 0, 并且要求sum{ Table[i]*Pairs }最大解法:将下界单独拿出来作为一部分进行计算, 因此[L[i], U[i]] 就转化为[1, U[i]-L[i]]的一个多重背包. M[i]和P[i]均进行单独的下界计算.计算出 T = L[1]*M[1]+L[2]*M[2].... 之后, 就是一个关于容量T刚好放满的多重背包
*/int N, P[205], M[205], L[205], U[205];
int LIM, dp[100005];void zobag(int w, int p) {for (int i = LIM; i >= w; --i) {if (dp[i-w] != ER)dp[i] = max(dp[i], dp[i-w] + p);    }
}int DP() {int q, n, k;dp[0] = 0;for (int i = 1; i <= N; ++i) { // 枚举的是物品的编号k = 1;while (U[i]-k > 0) { // 如果还能够分出这么多件出来  zobag(k*M[i], k*P[i]);U[i] -= k;k <<= 1;}if (U[i])zobag(U[i]*M[i], U[i]*P[i]);}return dp[LIM];
}int main() {int ret;while (scanf("%d", &N) != EOF) {LIM = ret = 0;memset(dp, 0x80, sizeof (dp));for (int i = 1; i <= N; ++i) {scanf("%d %d %d %d", &P[i], &M[i], &L[i], &U[i]);LIM += L[i] * M[i], U[i] -= L[i];ret += L[i] * P[i]; // P[i]同样要对下界进行一个计算, 最后再把其加回去
        }LIM *= -1; // 一定会是一个不大于0的数, 因为这已经是取得最小值, 而题目要求最后结果为0 printf("%d\n", DP() + ret);}return 0;
}

POJ-2754 Similarity of necklaces 2 区间取下界操作+DP相关推荐

  1. 【CodeForces - 438D】The Child and Sequence(线段树区间取模操作)

    题干: At the children's day, the child came to Picks's house, and messed his house up. Picks was angry ...

  2. Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸

    D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  3. 区间取点问题 C++实现

    区间取点问题 注意对输入数据的处理 #include<iostream> #include<algorithm> using namespace std;const int m ...

  4. 贪心算法之区间取点问题

    贪心算法之区间取点问题 题目描述: Assume the coasting is an infinite straight line. Land is in one side of coasting, ...

  5. 第3关:基础正则表达式--区间与区间取反

    任务描述 本关任务:运用正则表达式的区间表示方法,编写一个能从文本中快速匹配到数字与不是数字字符的小程序. 相关知识 为了完成本关任务,你需要掌握: 正则表达式区间的表达方式: 正则表达式区间取反的表 ...

  6. 区间类动态规划(dp)

    一.问题引入 给定长为n的序列a[i],每次可以将连续一段回文序列消去,消去后左右两边会接到一起, 求最少消几次能消完整个序列,n≤500.与线性模型不同,这里消去的顺序是任意的,且消完后左右会接起来 ...

  7. 区间最值操作与历史最值问题(一)

    前言 本文主要讲解一种叫做 SegmentTreeBeatsSegmentTree~BeatsSegmentTree Beats 的维护区间取最值操作的问题,以及维护区间历史最值的方法.本文参考自许多 ...

  8. 浅谈区间最值操作与历史最值问题

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 区间最值问题 以Gorgeous Sequence为例: 对于线段树上每个结点,我们维护 ...

  9. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

最新文章

  1. ubuntu安装KVM
  2. 程序员硬核资源:一本贼有趣的设计模式学习pdf
  3. C语言单链表实现19个功能完全详解
  4. 移植uboot第九步:支持yaffs映像烧写
  5. 十进制与二进制间的相互转换
  6. HTML怎么限制每行字数,JS实现每行固定字数,自动换行
  7. 怎样用bootsrapcol-md来实现四分屏_用会议平板提升会议效率,做好这两点
  8. java添加按钮点击事件_如何为odoo 10中的按钮点击事件添加一个java脚本处理程序?...
  9. 03-11 Android 纯 web 页面测试
  10. python下载网页上的pdf文件_利用Python把网页内容转换为pdf格式文件,批量下载到本地!...
  11. 【考研数学高数部分】无穷级数
  12. 这些食物一吃就胖,想减肥的人少碰!
  13. 北京理工大学本科毕业论文答辩和论文选题PPT模板
  14. STM32CubeMX外部中断
  15. keil_5软件编程护眼界面设置(护眼绿)
  16. css属性之padding和margin
  17. 赶紧投入es6的怀抱吧
  18. ​东京大学商汤悉尼大学等提出融合了动态规划、分治算法的MIM,实现绿色高效层次Transformer!已开源!...
  19. 华为路由器如何通过BootROM TFTP方式升级系统文件
  20. 脚本(计算机术语)简介

热门文章

  1. 计算机点击右键出现错误,电脑右键个性化打不开了怎么办
  2. 图层样式混合选项_ps教程,混合颜色带原理讲解
  3. 数值计算原理_JavaScript策略设计时数值计算精度问题解决方案
  4. pycharm缩进对齐线_代码中的缩进线
  5. python单词统计、给定一个段落()_自己动手Python写一个词频统计小项目
  6. 文件名lin.php是什么,Linsexu程序安装PHP详细软件教程
  7. strike F1 to retry boot,F2 for setup utility
  8. 标记偏置 隐马尔科夫 最大熵马尔科夫 HMM MEMM
  9. html重复div绘制,[DIV+CSS]绘制2重交叉表_html/css_WEB-ITnose
  10. 三维计算机视觉(四)--关键点