POJ-2754 Similarity of necklaces 2 区间取下界操作+DP
这题一个很巧妙的操作就是对一个给定的区间同意将下界拿出来, 然后转化为多重背包问题. 使用二进制优化.
代码如下:
#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相关推荐
- 【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 ...
- 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 ...
- 区间取点问题 C++实现
区间取点问题 注意对输入数据的处理 #include<iostream> #include<algorithm> using namespace std;const int m ...
- 贪心算法之区间取点问题
贪心算法之区间取点问题 题目描述: Assume the coasting is an infinite straight line. Land is in one side of coasting, ...
- 第3关:基础正则表达式--区间与区间取反
任务描述 本关任务:运用正则表达式的区间表示方法,编写一个能从文本中快速匹配到数字与不是数字字符的小程序. 相关知识 为了完成本关任务,你需要掌握: 正则表达式区间的表达方式: 正则表达式区间取反的表 ...
- 区间类动态规划(dp)
一.问题引入 给定长为n的序列a[i],每次可以将连续一段回文序列消去,消去后左右两边会接到一起, 求最少消几次能消完整个序列,n≤500.与线性模型不同,这里消去的顺序是任意的,且消完后左右会接起来 ...
- 区间最值操作与历史最值问题(一)
前言 本文主要讲解一种叫做 SegmentTreeBeatsSegmentTree~BeatsSegmentTree Beats 的维护区间取最值操作的问题,以及维护区间历史最值的方法.本文参考自许多 ...
- 浅谈区间最值操作与历史最值问题
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 区间最值问题 以Gorgeous Sequence为例: 对于线段树上每个结点,我们维护 ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
最新文章
- ubuntu安装KVM
- 程序员硬核资源:一本贼有趣的设计模式学习pdf
- C语言单链表实现19个功能完全详解
- 移植uboot第九步:支持yaffs映像烧写
- 十进制与二进制间的相互转换
- HTML怎么限制每行字数,JS实现每行固定字数,自动换行
- 怎样用bootsrapcol-md来实现四分屏_用会议平板提升会议效率,做好这两点
- java添加按钮点击事件_如何为odoo 10中的按钮点击事件添加一个java脚本处理程序?...
- 03-11 Android 纯 web 页面测试
- python下载网页上的pdf文件_利用Python把网页内容转换为pdf格式文件,批量下载到本地!...
- 【考研数学高数部分】无穷级数
- 这些食物一吃就胖,想减肥的人少碰!
- 北京理工大学本科毕业论文答辩和论文选题PPT模板
- STM32CubeMX外部中断
- keil_5软件编程护眼界面设置(护眼绿)
- css属性之padding和margin
- 赶紧投入es6的怀抱吧
- ​东京大学商汤悉尼大学等提出融合了动态规划、分治算法的MIM,实现绿色高效层次Transformer!已开源!...
- 华为路由器如何通过BootROM TFTP方式升级系统文件
- 脚本(计算机术语)简介
热门文章
- 计算机点击右键出现错误,电脑右键个性化打不开了怎么办
- 图层样式混合选项_ps教程,混合颜色带原理讲解
- 数值计算原理_JavaScript策略设计时数值计算精度问题解决方案
- pycharm缩进对齐线_代码中的缩进线
- python单词统计、给定一个段落()_自己动手Python写一个词频统计小项目
- 文件名lin.php是什么,Linsexu程序安装PHP详细软件教程
- strike F1 to retry boot,F2 for setup utility
- 标记偏置 隐马尔科夫 最大熵马尔科夫 HMM MEMM
- html重复div绘制,[DIV+CSS]绘制2重交叉表_html/css_WEB-ITnose
- 三维计算机视觉(四)--关键点