石子归并一
DZ T 0078-2015 固体矿产勘查原始地质编录规程

ICSD 10/19DZ 中华人民共和国地质矿产行业标准DZ/T0078-2015固体矿产勘查原始地质编录规程Procedures for Original Geological Record of Solid Mineral Exploration2015-04-15发布2015-07-01实施中华人民共和国国土资源部发布目次前言 (VI)1范围 (1)2规范性引用文件 (1)3地质编录的综合技术要求 (1)3.1目的任务 (1)3.2地质编录的基本内容 (1)3.3地质编录的基本要求 (2)3.3.1原始地质编录的及时性 (2)3.3.2工具、量具及设备和材料 (2)3.3.3自动记录软件的规定 (2)3.3.4计量单位名称和符号 (2)3.3.5编录工作的现场质量监控 (2)3.3.6原始地质编录资料的修改 (2)3.4地质编录用语、代号及编号 (2)3.4.1常用地质编录用语及代号 (3)3.4.2地质观察点与剖面编号 (3)3.4.3工程编号 (3)3.4.4预查阶段的探矿工程编号 (3)3.5地质观察、分层与布样 (4)3.5.1地质观察 (4)3.5.2地质分层 (4)3.5.3布样 (4)3.6绘图 (4)3.6.1原始编录图件分类 (4)3.6.2地质素描要求 (5)3.6.3非素描图类 (5)3.7地质描述与记录 (5)3.7.1地质描述内容 (5)3.7.2记录 (5)3.8野外资料整理要求 (6)3.8.1文、图、实物资料的核对 (6)3.8.2文字记录整理 (6)3.8.3标本、样品整理 (6)3.8.4野外图件整理与成图 (6)3.8.5岩矿层厚度计算 (6)3.9特殊矿种勘查地质编录 (7)4实测地质剖面 (7)4.1目的任务 (7)4.2技术准备 (7)4.2.1资料收集与综合整理 (7)4.2.2剖面位置选择 (7)4.2.3野外踏勘 (8)4.2.4剖面设计 (8)4.3剖面测制 (9)4.3.1基线布置 (9)4.3.2地质观察、分层与记录 (9)4.3.3作图步骤 (9)4.3.4记录 (10)4.3.5剖面测制中的物化探工作 (10)4.4编制综合地质柱状图 (10)4.5实测剖面小结 (10)4.6实测勘查线剖面 (11)4.6.1勘查线剖面用仪器法测制 (11)4.6.2勘查线剖面的内容 (11)5地质填图 (11)5.1目的任务 (11)5.2工作依据 (11)5.3填图比例尺的选择 (11)5.3.1填图比例尺的确定依据 (12)5.3.2预、普查填图比例尺 (12)5.3.3详查、勘探填图比例尺 (12)5.4填图精度要求 (12)5.4.1对地形底图的要求 (12)5.4.2对地质研究程度及地质体表示程度的要求 (12)5.5地质点布置 (13)5.5.1地质点位置 (13)5.5.2地质点分类 (13)5.5.3地质点密度及数量 (13)5.6填图方法及技术要求 (14)5.6.1野外踏勘 (14)5.6.2地质观察路线的布置 (14)5.6.3地质点的布置原则及要求 (15)5.6.4地质草图 (15)5.6.5地质简图 (15)5.7矿床地质填图及矿区地质填图 (15)5.7.1矿床地质填图 (15)5.7.2矿区地质填图 (16)5.8地质点定位 (16)5.8.1现场标注点位 (16)5.8.2测量坐标 (16)5.8.3精确定位 (16)5.9地质点的观察和记录要求 (16)5.9.1 5.9.1地质点的观察记录要求 (16)5.9.2 5.9.2地质点记录内容 (17)5.9.3地质界线勾绘 (17)5.10编制实际材料图 (17)5.11地质填图工作小结 (17)6探槽编录 (17)6.1编绘壁及绘图方向 (18)6.1.1竣工探槽的编绘壁及绘图方向 (18)6.1.2施工中探槽的编绘壁及绘图方向 (18)6.2基点基线设置 (18)6.2.1设置基点基线 (18)6.2.2基点基线数据的测量记录 (18)6.2.3工程定位 (18)6.3地质观察、分层与布样 (19)6.3.1总体要求 (19)6.3.2注意判别基岩与残坡积层及转石 (19)6.3.3布样 (19)6.3.4标注分层界线、样品位置及其代号 (19)6.3.5拍照 (19)6.4素描图 (19)6.4.1基本要求 (19)6.4.2普通探槽绘图方法 (21)6.4.3特殊探槽绘图方法 (23)6.4.4槽底的绘制长度及连续性 (27)6.5记录 (27)6.5.1总体要求 (27)6.5.2地质要素位置的记录规定 (27)6.6探槽及刻槽样在采样平面图上的展绘 (28)7探井地质编录 (31)7.1采样钻地质编录 (31)7.1.1采样钻的布置原则 (31)7.1.2地质编录及采样 (31)7.1.3采样钻的定位 (31)7.2小圆井地质编录 (31)7.2.1施工与地质编录应交替及时进行 (32)7.2.2小圆井展开作图法 (32)7.3浅井地质编录 (33)7.3.1施工与地质编录应交替及时进行 (33)7.3.2浅井壁展开作图法 (33)7.3.3野外编录要求 (35)8坑道地质编录 (35)8.1首选壁及绘图方向 (35)8.2基点基线设置 (35)8.2.2测量方位角及坡度角 (35)8.3观察、分层与布样 (35)8.3.1清洗坑壁 (36)8.3.2观察重点 (36)8.3.3标注分层界线、样品位置及其代号 (36)8.3.4布样 (36)8.3.5拍照 (36)8.4绘图 (36)8.4.1基本要求 (36)8.4.2绘图方法 (37)8.5记录 (42)8.5.1总体要求 (42)8.5.2地质要素位置的记录规定 (42)8.6坑道及刻槽样在平面图上的展绘 (44)8.7老硐地质编录 (44)8.7.1老硐调查 (44)8.7.2老硐清理 (45)8.7.3老硐地质编录 (45)9钻孔地质编录 (45)9.1主要工作内容 (45)9.2施工质量监控 (45)9.2.1施工准备 (45)9.2.2施工质量监控 (46)9.2.3残留岩心处理 (46)9.2.4钻孔的终孔 (46)9.3钻孔质量验收 (47)9.3.1验收要求 (47)9.3.2钻孔质量评级 (47)9.4地质编录 (47)9.4.1地质编录应随施工进度在现场进行 (47)9.4.2检查钻探班报表、整理检查岩矿心 (47)9.4.3岩矿心拍照 (48)9.4.4地质观察、分层与记录 (48)9.4.5钻孔布样 (52)9.4.6编制钻孔综合柱状图 (53)10采样编录 (54)10.1目的任务 (54)10.2各类工作项目采样的重点 (54)10.2.1实测地质剖面采样 (54)10.2.2地质填图采样 (54)10.2.3探矿工程采样 (54)10.3岩矿鉴定标本采样 (55)10.3.2采样原则和要求 (55)10.3.3标本的采集 (55)10.3.4矿石研究标本 (55)10.3.5标本的规格 (55)10.3.6标本的登记、包装及送样 (56)10.4化学分析采样 (56)10.4.1采样目的 (56)10.4.2采样原则及方法 (56)10.4.3采样长度的确定 (57)10.4.4钻孔岩矿心采样 (59)10.4.5刻槽采样 (60)10.4.6样品编号原则 (60)10.4.7样品编号、包装、称重 (61)10.4.8基本分析样 (62)10.4.9组合分析样 (62)10.4.10化学全分析样 (64)10.4.11光谱全分析样 (64)10.4.12岩石全分析样 (64)10.4.13物相分析样 (64)10.4.14化学分析质量监控 (64)10.5技术样 (65)10.5.1矿石加工技术试验采样 (65)10.5.2矿石体重样 (66)11野外原始地质编录资料的检查验收 (68)11.1检查内容 (68)11.2野外实地抽查资料的准确性和质量 (68)11.2.1野外原始资料的质量检查 (68)11.2.2野外原始图件 (68)11.2.3野外原始地质记录 (68)11.3原始地质编录应提交的资料 (69)附录A(规范性附录)固体矿产勘查原始地质编录中主要图件的图式及内容 (71)附录B(规范性附录)固体矿产勘查原始地质编录中主要用表格格式 (78)前言本标准按照GB/T 1.1-2009《标准化工作导则第1部分:标准的结构和编写》给出的规则起草。
石子归并(动态规划)

石子归并(动态规划)动态规划石子合并问题【石材加固】在一个圆形操场的四周摆放着n堆石子。
现要将石子有次序地合并成一堆。
规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。
尝试设计一个算法来计算将n堆石头合并成一堆的最小分数和最大分数。
[输入文件]包含两行,第1行是正整数n(1<=n<=100),表示有n堆石子。
第2行有n个数,分别表示每堆石子的个数。
【输出文件】输出两行。
第1行中的数字是最低分数;第2行中的数字是最高分。
[输入示例]44459[输出示例]4354【分析】起初,我以为贪心法可以解决这个问题,但事实上,由于必须有两个相邻的桩合并,贪心法不能保证每次都能得到所有桩中石头数量最多的两个桩。
例如,以下示例:6346542如果使用贪心法计算最小分数,则应为以下合并步骤:第一次合并3465422,3合并分数为5,第二次合并546545,4合并分数为9,第三次合并96545,4合并分数为9,第四次合并9699,6合并分数为15,第五次合并15915,9合并分数为24,总分=5+9+9+15+24=62但是如果采用如下合并方法,却可以得到比上面得分更少的方法:第一次合并3465423,4合并得分是7第二次合并765427,6合并得分是13第三次合并135424,2合并得分是6第四次合并13565,6合并得分是11第五次合并131113,11合并得分是24总得分=7+13+6+11+24=61因此,我们知道这个问题不能用贪婪的方法来解决。
在上面的例子中,相邻的两个石子数量分别为13和11的桩第五次合并。
第一堆、第二堆和第三堆(石块数量分别为3、4和6)以及第四、第五和第六堆(石块数量分别为5、4和2)组合四次后形成两堆石块。
所以问题归结为如何使两个子序列的N-2组合分数之和达到最优。
为了实现这一目标,我们将第一个序列分为两个:第一和第二堆形成子序列1,第三堆形成子序列2。
第8课 石子归并(C++)

第8课石子归并【问题描述】在一个操场按次序从左到右摆放着n堆石子(n≤100),现要将石子有次序地合并成一堆。
规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分,求最小的得分总和。
【输入格式】第1行为石子堆数n;第2行为每堆的石子数,每两个数之间用一个空格分隔。
【输出格式】最小的得分总和。
【输入样例】6346542【输出样例】61样例说明:346542765421354213561311247+13+6+11+24=61分析问题对于动态规划类型的题目,首先要分析出问题的最优子结构。
前面介绍的动态规划类型都是“i的规模”问题由“i-1规模”或更小规模的子问题决策出来的。
如:1.“黑熊过河”中走到第i步的最优值是由第i-1和第i-2步的最优值决策出的:f[i]=max{f[i-l],f[i-2]}-Q+a[i]2.“防卫导弹”中到第i个导弹的最优值是由小于i的子问题最优值来决策出的:f[i]=max{f[j])+1(1≤j<i,h[j]≥h[i])3.“最长公共子序列”中,两个长度分别为i和j的字符串的最长公共子序列是由短一点的子问题最优值决策出来:O当i=0或j=0时f[i,j]=f[i-1,j-1]+1当i,j>O时,且xi =yi时Max(f[i,j-1],f[i-1,j])当i,j>O时,且xi ≠yi时然而这里的“i的规模问题”其实都是隐含地表示“从1到i的问题”,即从头开始到第i步的问题。
即f[i]实际上是f[1..i],f[i,j]实际上是f[1..i,1..j]。
本题是另一类动态规划问题,如果用类似前面介绍的方法分析会比较困难。
实际上,我们合并i堆石子时,可能先选择中间相邻的两堆石子,合并之后,虽然只有i-1堆石子,但并不是原先的1~i-1的子问题。
因此我们没有办法把一个f[1..i]的i堆石子问题直接转化成f[1..j](j<i)的子问题来决策。
《JTG-F80/1-2019公路工程质量检验评定标准》

3DEC用户手册(4.0)中文版

石子合并问题 三种类型

一:任意版有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为将的一堆石子的数量。
设计一个算法,将这N堆石子合并成一堆的总花费最小(或最大)。
此类问题比较简单,就是哈夫曼编码的变形,用贪心算法即可求得最优解。
即每次选两堆最少的,合并成新的一堆,直到只剩一堆为止。
证明过程可以参考哈夫曼的证明过程。
二:直线版在一条直线上摆着N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动相邻的2堆石子合并,合并花费为将的一堆石子的数量。
设计一个算法,将这N堆石子合并成一堆的总花费最小(或最大)。
如果熟悉矩阵连乘对这类问题肯定非常了解。
矩阵连乘每次也是合并相邻两个矩阵(只是计算方式不同)。
那么石子合并问题可用矩阵连乘的方法来解决。
那么最优子结构是什么呢?如果有N堆,第一次操作肯定是从n-1个对中选取一对进行合并,第二次从n-2对中选取一对进行合并,以此类推……设best[i][j]表示i-j合并的最优值, sum[i][j]表示第i堆石子到第j堆石子的总数量,递推公式如下:#include <cstdlib>#include <cstdio>#include <cmath>#include <algorithm>using namespace std;#define MAXN 100int sum[MAXN];int best[MAXN][MAXN];int n, stone[MAXN];int getBest(){//初始化,没有合并,花费为0for(int i = 0; i < n; ++i){best[i][i] = 0;}//还需进行合并次数for(int v = 1; v < n; ++v){//每次合并都是一条对角线,i表示行for(int i = 0; i < n - v; ++i){//根据第v次合并,现在更新i行值可以求出列的值int j = i + v;best[i][j] = INT_MAX;int add = sum[j] - (i > 0 ? sum[i - 1] : 0);//中间断开位置,取最优值for(int k = i; k < j; ++k){best[i][j] = min(best[i][j], best[i][k] + best[k + 1][j] + add);}}}return best[0][n - 1];}int main(){scanf("%d", &n);for(int i = 0; i < n; ++i)scanf("%d", &stone[i]);sum[0] = stone[0];for(int i = 1; i < n; ++i){sum[i] = sum[i - 1] + stone[i];}int best = getBest();printf("%d\n", best);return 0;}三:圆形版如果石子是排成圆形,其余条件不变,那么最优值又是什么呢?因为圆形是首尾相接的,初一想,似乎与直线排列完全成了两个不同的问题。
石子合并(动态规划)详细解题报告
二.算法分析竞赛中多数选手都不约而同地采用了尽可能逼近目标的贪心法来逐次合并:从最上面的一堆开始,沿顺时针方向排成一个序列。
第一次选得分最小(最大)的相邻两堆合并,形成新的一堆;接下来,在N-1堆中选得分最小(最大)的相邻两堆合并……,依次类推,直至所有石子经N-1次合并后形成一堆。
例如有6堆石子,每堆石子数(从最上面一堆数起,顺时针数)依次为346542要求选择一种合并石子的方案,使得做5次合并,得分的总和最小。
按照贪心法,合并的过程如下:每次合并得分第一次合并346542 ->5第二次合并54654 ->9第三次合并9654 ->9第四次合并969 ->15第五次合并159 ->2424总得分=5+9+9+15+24=62但是当我们仔细琢磨后,可得出另一个合并石子的方案:每次合并得分第一次合并346542 ->7第二次合并76542 ->13第三次合并13542 ->6第四次合并1356 ->11第五次合并1311 ->2424总得分=7+6+11+13+24=61显然,后者比贪心法得出的合并方案更优。
题目中的示例故意造成一个贪心法解题的假像,诱使读者进入“陷阱”。
为了帮助读者从这个“陷阱”里走出来,我们先来明确一个问题:1.最佳合并过程符合最佳原理使用贪心法至所以可能出错,是因为每一次选择得分最小(最大)的相邻两堆合并,不一定保证余下的合并过程能导致最优解。
聪明的读者马上会想到一种理想的假设:如果N-1次合并的全局最优解包含了每一次合并的子问题的最优解,那么经这样的N-1次合并后的得分总和必然是最优的。
例如上例中第五次合并石子数分别为13和11的相邻两堆。
这两堆石头分别由最初的第1,2,3堆(石头数分别为3,4,6)和第4,5,6堆(石头数分别为5,4,2)经4次合并后形成的。
于是问题又归结为如何使得这两个子序列的N-2次合并的得分总和最优。
经典的动态规划入门练习题
动态规划入门练习题1.石子合并在一个圆形操场的四周摆放着N堆石子(N<= 100),现要将石子有次序地合并成一堆.规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.编一程序,由文件读入堆栈数N及每堆栈的石子数(<=20).(1)选择一种合并石子的方案,使用权得做N-1次合并,得分的总和最小;(2)选择一种合并石子的方案,使用权得做N-1次合并,得分的总和最大;输入数据:第一行为石子堆数N;第二行为每堆的石子数,每两个数之间用一个空格分隔.输出数据:从第一至第N行为得分最小的合并方案.第N+1行是空行.从第N+2行到第2N+1行是得分最大合并方案.每种合并方案用N行表示,其中第i行(1<=i<=N)表示第i次合并前各堆的石子数(依顺时针次序输出,哪一堆先输出均可).要求将待合并的两堆石子数以相应的负数表示.输入输出范例:输入:44 5 9 4输出:-459-4-8-59-13-9224-5-944-14-4-4-1822最小代价子母树设有一排数,共n个,例如:22 14 7 13 26 15 11.任意2个相邻的数可以进行归并,归并的代价为该两个数的和,经过不断的归并,最后归为一堆,而全部归并代价的和称为总代价,给出一种归并算法,使总代价为最小.输入、输出数据格式与“石子合并”相同。
输入样例:412 5 16 4输出样例:-12-516417-16-4-17-20372.背包问题设有n种物品,每种物品有一个重量及一个价值。
但每种物品的数量是无限的,同时有一个背包,最大载重量为XK,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于XK,而价值的和为最大。
输入数据:第一行两个数:物品总数N,背包载重量XK;两个数用空格分隔;第二行N个数,为N种物品重量;两个数用空格分隔;第三行N个数,为N种物品价值; 两个数用空格分隔;输出数据:第一行总价值;以下N行,每行两个数,分别为选取物品的编号及数量;输入样例:4 102 3 4 71 3 5 9输出样例:122 14 13.商店购物某商店中每种商品都有一个价格。
石子和砂的比重换算
石子一方等于多少吨
由于石头的密度是不一样的,还有就是大小不清楚,如果想得到一个准确的数据是很难的。
不过多数情况下,我们只需要知道大概的数据就可以了。
没有必要太精确。
教给大家一个精略的计算方法:
石头密度为2g每立方厘米
一方=1000000立方厘米:
1.2*2=
2.4吨
1.3*2=
2.6吨
上面是没有考虑空隙因素的。
从实际生产生活的经验来看。
一方石子=1.6吨石子左右。
一方沙子等于多少吨
盖房子的沙子,一般都是用方来计算的。
在运输的时候,需要知道一下大概的数据,考虑一下每次运输的数量。
一般沙子的重要,是由它的密度来计算的,当然还有考虑含水量多少。
一般的要求建筑用砂子堆积密度为1350-1450kg/M3,由此很快可以算出一方(即一立方米)砂的重量约为1.35-1.45吨。
如果含水量较高的话,那重要会更大。
一吨沙子是多少方呢?
密度如下(机械设计手册)
粗沙1.4-1.9
细沙1.4-1.9(干)
细沙1.8-2.1(含水)
一吨沙等于多少方
约为0.48-0.71方。
粒径mm 容重公斤/m3
特细碎石5-10
细碎石10-20 约1400-1500 碎石中碎石20-40
粗碎石40-150
特细卵石5-10
细卵石10-20 约1600-1800 卵石中卵石20-40
粗卵石40-150
砂不论粗中细特细干燥状态平均1500-1600公斤/m3。
动态规划中的石子归并问题
动态规划中的⽯⼦归并问题⼀.有N堆⽯⼦,每堆的重量是w[i],可以任意选两堆合并,每次合并的花费为w[i]+w[j],问把所有⽯⼦合并成为⼀堆后的最⼩花费是多少。
因为是可以任意合并,所以每次合并的时候选最⼩的两堆合并,贪⼼即可。
⼆.有N堆⽯⼦,每堆的重量是a[i],排成⼀条直线,每次只能合并相邻的两堆,直到合成⼀堆为⽌,问最后的最⼩花费是多少。
分析:因为规定了只能合并相邻的两堆,显然不能使⽤贪⼼法。
分成⼦问题来考虑,定义dp[i][j]表⽰从第i的⽯⼦合并到第j个⽯⼦的最⼩花费,那么dp[1][N]就是问题的解。
可以推出dp[i][j] = min(dp[i][k]+dp[k+1][j]) k∈(i,j)初始时dp[i][j] = INF(i!=j) dp[i][i] = INF1 #include <iostream>2 #include <cstring>3 #include <cstdio>4 #include <string>5 #include <algorithm>6using namespace std;7int T, n;8int a[210], dp[210][210], sum[210], s[210][210];9//这⾥是数据量⽐较⼩10int INF = 99999999;11int main(){12while(scanf("%d", &n) != EOF){13 memset(sum, 0, sizeof(sum));14for(int i = 1; i <= n; i++){15 cin>>a[i];16 sum[i] = sum[i-1] + a[i];17 }18for(int i = 1; i <= n; i++){19for(int j = 1; j <= n; j++)20 dp[i][j] = INF;21 }22for(int i = 1; i <= n; i++) dp[i][i] = 0;2324for(int len = 2; len <= n; len++){ //表⽰归并的长度25for(int i = 1; i <= n-len+1; i++){ //归并的第⼀位26int j = i+len-1; //归并的最后⼀位27for(int k = i; k < j; k++){28 dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]);29 }30 }31 }32 cout<<dp[1][n]<<endl;33 }34return0;35 }这样复杂度是O(N^3)可以利⽤四边形不等式优化到O(N^2)四边形不等式:如果对于任意的a≤b≤c≤d,有m[a,c] + m[b,d] <= m[a,d] + m[b,c]那么m[i,j]满⾜四边形不等式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中山纪念中学 宋新波
动态规划的关键点
• 最优化原理 子问题最优化结构 • 无后效性 未来与过去无关 • 状态 描述最优解的结构 • 状态转移方程 递归定义最优解的值 • 程序实现 用记忆化搜索或迭代法求解
例1:01背包
• 有N种物品和一个容量为V的背包。第i种物品 只有1过背包 容量,且价值总和最大,求出这个最大价值。
方法三
• 证明: • 当x=0时:只要都不选就可以; • 当1<=x<=2^k-1时:把x转为二进制,选择对应位为1 的物品。如x=5,5的二进制为101,5=1+4; • 当2^k<=x<=m[i]时:由于m[i]-(2^k-1)<2^k,则选 择m[i]-(2^k-1),剩下的为x-m[i]+2^k-1<=2^k-1可 以由前面的1,2,...,2^(k-1)组合得到。 m[ i ] • 物品i可以被分解为 log 2 个数量为1的物品,题目就 转化为 log 个物品的01背包。 • 时间复杂度为O(V* log )。
方法二
• 方法一中计算f[i]时需要从1到i-1逐一枚举j,我们 可以记录g[x]表示,以数值x结尾的最长上升子序列 的长度,利用树状数组维护g[1..x]的最大值,在计 算f[i]时直接利用树状数组计算出g[1..a[i]-1]的最 大值。 • 如果a[i]数值不大可以直接做,否则需要离散化。 • 时间复杂度为O(nlgn)。
N i 1
方法二
• 把“m[i]个第i种物品”看作是“m[i]种物品”,每种 物品只有一个,体积和价值分别为v[i]和w[i],这样 原问题就转变为 m[i] 个物品的01背包问题。 • 时间复杂度也是O(V* m[i] )。
N i 1
N
i 1
方法三
• 应用二进制的思想,我们考虑把第i种物品换成若干件物 品,使得原问题中第i种物品可取的每种策略(取0..m[i] 件)均能等价于取若干件代换以后的物品。另外,取超过 m[i]件的策略必不能出现。 • 方法是:将第i种物品分成若干件物品,其中每件物品有 一个系数,这件物品的体积和价值均是原来的体积和价值 乘以这个系数。使这些系数分别为 1,2,4,...,2^(k1),m[i]-2^k+1,其中k满足m[i]-2^k+1<2^k。例如,如果 m[i]为13,就将这种物品分成系数分别为1,2,4,6的四件 物品。 • 如何证明任何x(0<=x<=m[i])都可以用上述系数相加得到?
• 给你n个数a1,a2,...,an的序列,要求输出最 长上升子序列的长度。 • 如n=6,序列为{3 4 1 5 2 6}的最长上升子序 列的长度为4,子序列为{3,4,5,6}
方法一
• 状态:f[i]表示以a[i]结尾的最长上升子序列的长度。 • 考虑前一个数可能的位置进行状态转移,假设前一个数 是a[j],则必须满足j<i同时a[j]<a[i],满足条件的j 有多个,找出最大的f[j]即可。 • 状态转移方程为: • 1 i=1 • f[i]= • max{f[j],0}+1 (j<i)and(a[j]<a[i]) • 答案为max{f[i]}(1<=i<=n)。时间复杂度为O(n2)。
分析
• 状态:f[i,j]表示用体积为j的背包装前i个物品能获 得的最大价值。 • 考虑第i种物品装或不装进行状态转移: 1.装:f[i-1,j-v[i]]+w[i](必须满足j>=v[i]) 2.不装:f[i-1,j] 两种情况取较大值。 • 状态转移方程为:
• 0 i=0(边界条件) • f[i,j]= f[i-1,j] j<v[i] • max(f[i-1,j],f[i-1,j-v[i]]+w[i]) j>=v[i]
n m[ i ] 2 i 1
n
m[ i ] 2
i 1
方法四
• 回顾方法一状态转移方程: • 0 i=0 f[i,j]= • max{f[i-1,j-x*v[i]]+x*w[i]} 0<=x<=min(m[i],j div v[i]) • 可以用单调队列优化到O(N*V)。
例4:最长上升子序列
• 答案为f[n,v],时间复杂度为O(N*V)。
例2:完全背包
• 有N种物品和一个容量为V的背包。第i种物品 有无穷个,体积是v[i],价值是w[i]。选择物 品装入背包使这些物品的体积总和不超过背包 容量,且价值总和最大,求出这个最大价值。
方法一
• 状态:f[i,j]表示用体积为j的背包装前i个物品能获 得的最大价值。 • 考虑第i个物品装几个来进行状态转移,假设装x个, x的范围为0<=x<=j div v[i] • 状态转移方程:
例3:多重背包
• 有N种物品和一个容量为V的背包。第i种物品最 多有m[i]件可用,体积是v[i],价值是w[i]。 选择物品装入背包可使这些物品的体积总和不 超过背包容量,且价值总和最大。
方法一
• 状态:f[i,j]表示用体积为j的背包装前i个物品能获 得的最大价值。 • 跟完全背包方法一相同,考虑第i个物品装几个来进行 状态转移,假设装x个,x的范围为0<=x<=min(j div v[i],m[i]) • 状态转移方程: 0 i=0 f[i,j]= • max{f[i-1,j-x*v[i]]+x*w[i]} 其中0<=x<=min(m[i],j div v[i]) • 答案为f[n,v],时间复杂度为O(V* m[i])。
0 i=0
f[i,j]=
max{f[i-1,j-x*v[i]]+x*w[i]} 0<=x<=j div v[i]
• 答案为f[n,v],时间复杂度为o( V
2
*
i 1
N
1 v[i ]
)
方法二
• 状态:f[i,j]表示用体积为j的背包装前i个物品能获得的 最大价值。 • 考虑第i个物品装或不装来进行状态转移: 1.装:必须满足j>=v[i],由于物品有无穷多个,装一次 后后面还可以再装,所以状态为f[i,j-v[i]]+w[i]; 2.不装:f[i-1,j] • 状态转移方程: • 0 i=0 • f[i,j]= f[i-1,j] j<v[i] • max(f[i-1,j],f[i,j-v[i]]+w[i]) j>=v[i] • 答案为f[n,v],时间复杂度为O(N*V)。