Chapter 4 动态规划 习题
动态规划练习题(含答案)

动态规划练习题USACO 2.2 Subset Sums题目如下:对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。
举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:and {1,2}这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:{1,6,7} and {2,3,4,5} {注1+6+7=2+3+4+5}{2,5,7} and {1,3,4,6}{3,4,7} and {1,2,5,6}{1,2,4,7} and {3,5,6}给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。
程序不能预存结果直接输出。
PROGRAM NAME: subsetINPUT FORMAT输入文件只有一行,且只有一个整数NSAMPLE INPUT (file subset.in)7OUTPUT FORMAT输出划分方案总数,如果不存在则输出0。
SAMPLE OUTPUT (file subset.out)4参考程序如下:#include <fstream>using namespace std;const unsigned int MAX_SUM = 1024;int n;unsigned long long int dyn[MAX_SUM];ifstream fin ("subset.in");ofstream fout ("subset.out");int main() {fin >> n;fin.close();int s = n*(n+1);if (s % 4) {fout << 0 << endl;fout.close ();return ;}s /= 4;int i, j;dyn [0] = 1;for (i = 1; i <= n; i++)for (j = s; j >= i; j--)dyn[j] += dyn[j-i];fout << (dyn[s]/2) << endl;fout.close();return 0;}USACO 2.3 Longest Prefix题目如下:在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。
动态规划讲解大全含例题及答案

动态规划讲解大全含例题及答案动态规划讲解大全动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。
20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。
1957年出版了他的名著Dynamic Programming,这是该领域的第一本著作。
动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。
例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。
虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。
动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。
不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。
动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。
因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。
我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。
基本模型多阶段决策过程的最优化问题。
在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。
动态规划专项练习题解

另一种方法
• 将原串与原串的倒序做一次LCS—最长公 共子序列,用原串长度减去LCS长度,即 为需要插入字符的个数 • 例如:ab3bd与 db3ba • LCS(‘ab3bd’, ‘db3ba’)=‘b3b’ • 因此, ans=Len(‘ab3bd’)-Len(‘b3b’)=2
LCS的求法
• 最长公共子串(LCS),有三种情况: 1. 公共子串的元素必须相邻. 2. 公共子串的元素可以不相邻 3. 求多个字符串而不是两个字符串的最长公共 子串 • 动归4中,我们讲了求情况2的LCS序列。下面我们 来讨论情况1的做法。
• 任务:对于任意一个字符串,输出将这个字符串 变为回文串需要插入的最少字符个数,比如, ab3bd只需要插入2个字符就可以变为一个回文串. • 0<n<=1992,n为字符串长度。
分析
• ab3bd • 只需变为adb3bda即可,在前面插入d,在 后面插入a; • 我们分几种情况讨论:
– 若A形如 ?A?,(问号代表任意一个相同字符, 下同)则只需将A变为回文串。 – 若A形如?A再在A的后面插入一个”?” – 若A形如A ?再在A的前面插入一个”?”
分析
• 性质:青蛙遍历的路径不会相交。
• 上图中图2的路径比图1要短。 • 证明:图1: D1=d(1,3)+d(2,3)+d(2,4) 图2: D2=d(1,2)+d(2,3)+d(3,4) 要证明D1>D2,只要证明d(1,3) +d(2,4)>d(1,2)+d(3,4) 连接两边,见图3,由三角形的三边关系定理即可证明。
动态规划
• 设f(i,j)为将Ai..Aj变为回文串的最小代价,则
f (i 1, j 1), 若a[i] a[ j ] f (i, j ) min f (i 1, j ) 1, 若a[i] a[ j ],后插一个字符 f (i, j - 1) 1,若a[i] a[ j ],前插一个字符
动态规划习题答案

动态规划习题答案2.某公司有资金4百万元向A,B和C3个项目追加投资,各个项目可以有不同的投资额(百万元计),相应的效益如表所示。
问怎样分配资金,使总效益值最大?##表8-47解:设S1-A,B,C项目的总投资额,S2-B、C项目的总投资额S3-C项目的投资额;X k-k项目的投资额;(X1-A项目的投资额,X2-B项目的投资额,X3-C项目的投资额)W k(S k,X k)-对K项目投资X k后的收益:W k(S k,X k)=W k (X k)T k (S k,X k)-S k+1=S k-X kf k (S k)-当K至第3项目允许的投资额为S k时所能获得的最大收益。
为获得最大利润,必须将4百万全部投资,假设有4阶段存在,有S4=0,建立递归方程f4 (S k)=0f k (S k)=max{ W k (X k)+f k +1(S k+1)} k=3,2,1X k?D k(S k)第一步,K=3f4(S4)=0f3 (S3)=max{W3 (X3)+f4 (S4)}X3?D3(S3)S4=S3-X3第二步:K=2 f2 (S2)=max{W2 (X2)+f3 (S3)} X2?D2(S2)S3=S2-X2W2 (X2)+f3 (S2-X2)第三步:K=1 f1 (S1) =max {W1 (X1)+ f2 (S2)} X1?D1(S1)S2= S1- X1W1 (X1)+ f2 (S1- X1)S1=4 →S2=1 →S3=1↓↓↓X1*=3 X2*=0 X3*=1A投资3百万,B不投资C投资1百万。
总收益164百万元。
3.(最优分配问题)有一个仪表公司打算向它的3个营业区设立6家销售店。
每个营业区至少设一家,所获利润如表。
问设立的6家销售店数应如何分配,可使总利润最大?解:s k——对k#,…,3#营业区允许设立的销售店数x k——对k#营业区设立的销售店数w k (s k,x k)——对k#营业区设立x k销售店后的利润:w k (s k,,x k)= w k (x k)T k (s k, x k)——s k +1= s k - x kf k (s k)——当第k至第3个营业区允许设立的销售店数为s k 时所能获得的最大利润递归方程:f4(s4)=0f k (s k)=max {wk (xk)+ fk+1(sk+1)}, k=3,2,1 xk?Dk(sk)k=3时,有方程f4 (s4)=0f3(s3)= max {w3(x3)+ f4(s4) }x3?D3(s3)s3=s2—x2k=2,有方程f2(s2)= max {w2(x2)+ f3(s3) }x2?D2(s2)s3=s2—x2k=1,有方程f1(s1)= max {w1(x1)+ f2(s2) }x1?D1(s1)s2=s1—x1s1=6 → s2=3 → s3=2↓↓↓x1*=3 x2*=1 x3*=2分别A1、A2、A3营业区设立3家、1家、2家销售店,最大利润为7704.用动态规划方法求解下列模型:maxf=10X1+4X2+5X3s.t. 3X1+5 X2+4 X3≤150≤X1≤2 0≤X2≤2 X3≥0 ,X j为整数j=1,2,3解:收费C1=10 C2=4 C3=5X1为货物1的装载件数X2为货物2的装载件数X3为货物3的装载件数分3阶段S1为货物1、2、3允许的装载重量(3X1+5 X2+4 X3的允许值)S2为货物2、3允许装载的重量(5 X2+4 X3的允许值)S3 为货物3允许装载的重量(4 X3的允许值)第一步:K=3f4(S4)=0f3(S3)= max{5X3+ f4(S4)| X3?D3(S3)}S4= S3 -4 X3第二步:K=2f2(S2)= max{4X2+ f3(S3)| X2?D2(S2)} S3= S2 -5 X2划分点:第三步:K=1f1(S3)= max{10X1+ f2(S2)| X1?D1(S1)} S2= S1-3 X110X1+ f2(S1-3 X1)顺序追踪:最优策略为S1=15 →S2=9 →S3=9↓↓↓X1*=2 X2*=0 X3*=2最优装载方案为:货物1装2件;货物2不装;货物3装2件装载收费为30元5.用动态规划方法解下列0—1背包问题:Max f =12x1+12x2+9x3+16x4+30x5;s.t. 3x1+4x2+3x3+4x4+6x5≤12;x j=0,1, j=1,……,5解:本问题分为5个阶段。
动态规划习题完整版

动态规划习题Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】动态规划专题分类视图数轴动规题:题1.2001年普及组第4题--装箱问题【问题描述】有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0<n≤30),每个物品有一个体积(正整数)。
要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
【输入格式】输入文件box.in有若干行。
第一行:一个整数,表示箱子容量V;第二行:一个整数,表示物品个数n;接下来n行,分别表示这n个物品的各自体积。
【输出格式】输出文件box.out只有一行数据,该行只有一个数,表示最小的箱子剩余空间。
【输入样例】2468312797【输出样例】题2.1996年提高组第4题--砝码秤重__数据加强版【问题描述】设有n种砝码,第k种砝码有Ck 个,每个重量均为Wk,求:用这些砝码能秤出的不同重量的个数,但不包括一个砝码也不用的情况。
【输入格式】输入文件weight.in的第一行只有一个数n,表示不同的砝码的种类数.第2行至第n+1行,每行有两个整数.第k+1行的两个数分别表示第k种砝码的个数和重量.【输出格式】输出文件weight.out中只有一行数据:Total=N。
表示用这些砝码能秤出的不同重量数。
【输入样例】22223【输出样例】Total=8【样例说明】重量2,3,4,5,6,7,8,10都能秤得【数据限制】对于100%的数据,砝码的种类n满足:1≤n≤100;对于30%的数据,砝码的总数量C满足:1≤C≤20;对于100%的数据,砝码的总数量C满足:1≤C≤100;对于所有的数据,砝码的总重量W满足:1≤W≤400000;题3.石子归并-szgb.pas【问题描述】有一堆石头质量分别为W1,W2,…,Wn.(Wi≤10000),将石头合并为两堆,使两堆质量的差最小。
【输入】输入文件szgb.in的第一行只有一个整数n(1≤n≤50),表示有n堆石子。
动态规划习题集全

动态规划专题训练护卫队【问题描述】护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥。
因为街道是一条单行道,所以任何车辆都不能超车。
桥能承受一个给定的最大承载量。
为了控制桥上的交通,桥两边各站一个指挥员。
护卫车队被分成几个组,每组中的车辆都能同时通过该桥。
当一组车队到达了桥的另一端,该端的指挥员就用电话通知另一端的指挥员,这样下一组车队才能开始通过该桥。
每辆车的重量是已知的。
任何一组车队的重量之和不能超过桥的最大承重量。
被分在同一组的每一辆车都以其最快的速度通过该桥。
一组车队通过该桥的时间是用该车队中速度最慢的车通过该桥所需的时间来表示的。
问题要求计算出全部护卫车队通过该桥所需的最短时间值。
【输入格式】输入文件中的第一行包含三个正整数(用空格隔开),第一个整数表示该桥所能承受的最大载重量(用吨表示),第二个整数表示该桥的长度(用千米表示),第三个整数表示该护卫队中车辆的总数(n<1000)。
接下来的几行中,每行包含两个正整数W和S(用空格隔开),W表示该车的重量(用吨表示),S表示该车过桥能达到的最快速度(用千米/小时表示)。
车子的重量和速度是按车子排队等候时的顺序给出的。
【输出格式】输出文件中应该是一个实数,四舍五入精确到小数点后1位,表示整个护卫车队通过该桥所需的最短时间(用分钟表示)。
【输入输出样例】输入:100 5 1040 2550 2050 2070 1012 509 7049 3038 2527 5019 70输入:75.0DOLLARS【问题描述】在以后的若干天里戴维将学习美元与德国马克的汇率。
编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值。
【输入格式】输入文件中的第一行是一个自然数N(1<=N<=100),表示戴维学习汇率的天数。
接下来的N行中每行是一个自然数A(1<=A<=1000)。
第i+1行的A表示预先知道的第i+1天的平均汇率,在这一天中,戴维既能用100美元买A马克也能用A马克购买100美元。
动态规划复习题

动态规划复习题在计算机科学和数学领域中,动态规划是一种非常重要的算法思想和解题策略。
它常常被用于解决那些具有重叠子问题和最优子结构性质的问题,能够有效地降低计算复杂度,提高算法的效率。
动态规划的核心思想是将一个复杂的问题分解成若干个子问题,并通过保存子问题的解来避免重复计算,从而逐步求解出原问题的最优解。
这种方法的关键在于找出问题的最优子结构和状态转移方程。
让我们通过一个经典的例子来理解动态规划的基本概念。
假设有一个楼梯,我们需要从楼梯的底部走到顶部。
每次可以向上走 1 级或者 2 级台阶。
那么,请问走到第 n 级台阶共有多少种不同的走法?我们可以用动态规划的方法来解决这个问题。
首先,定义一个数组dp,其中 dpi 表示走到第 i 级台阶的不同走法数量。
对于第 1 级台阶,只有 1 种走法,即直接走上去,所以 dp1 = 1。
对于第 2 级台阶,可以一次走 2 级,也可以分两次每次走 1 级,所以 dp2 = 2。
对于第 i 级台阶(i > 2),它可以从第 i 1 级台阶走 1 级到达,也可以从第 i 2 级台阶走 2 级到达。
所以,走到第 i 级台阶的走法数量等于走到第 i 1 级台阶的走法数量加上走到第 i 2 级台阶的走法数量,即dpi = dpi 1 + dpi 2。
通过这种方式,我们可以从第 1 级和第 2 级台阶的基础情况出发,逐步计算出 dpn,即走到第 n 级台阶的不同走法数量。
另一个常见的动态规划问题是背包问题。
假设有一个背包,它的容量为 C,有 n 个物品,每个物品有自己的重量 wi和价值 vi。
我们需要选择一些物品放入背包,使得背包中物品的总价值最大。
同样地,我们可以定义一个二维数组 dp,其中 dpij 表示在前 i 个物品中,背包容量为 j 时能够获得的最大价值。
对于第 1 个物品,如果背包容量足够容纳它,那么 dp1j = v1(j >= w1),否则 dp1j = 0。
动态规划作业完整

动态规划作业1、1、设某工厂自国外进口一部精密机器,由机器制造厂至出口港有三个港口可供选择,而进口港又有三个可供选择,进口后可经由两个城市到达目的地,其间的运输成本如图中所标的数字,试求运费最低的路线?把A看作终点,该问题可分为4个阶段f k(S k)表示从第K阶段点S k到终点A的最短距离f4(B i)=20, f4(B2)=40, f4(B3)=30f3(C i)=min[d 3(C i, B i)+ f4(B i), d3(C i, B2)+ f4(B2), d3(C i, B3)+ f4(B3)]=70,U3(C l)= B2 或B3f3(C2)=40,U3(C2)= B3f3(C3)=80,U3(C3)= B l 或B2 或B3以D i)=80,U2(D I)=C If2(D2)=70,U2(D2)= C2f i(E)=110,U i(E)= D i 或D2所以可以得到以下最短路线,E T D I^C I^B 2 / B3^AE TD 2^C 2TB 3—A2、习题4 — 2解:1)将问题按地区分为三个阶段,三个地区的编号分别为1、2、3;2)设Sk表示为分配给第k个地区到第n个地区的销售点数,Xk表示为分配给第k个地区的销售点数,S k +1 = S k —X kPk(Xk)表示为Xk个销售点分到第k个地区所得的利润值fk(Sk)表示为Sk个销售点分配给第k个地区到第n个地区的最大利润值3)递推关系式:fk(Sk) = max[ Pk(Xk)+ f k+i(S k —X k) ] k=3,2,1f4(S4) = 04)从最后一个阶段开始向前逆推计算第三阶段:设将S3个销售点(S3= 0,1,2,3,4)全部分配给第三个地区时,最大利润值为:f3(S3)= max[P3(X3)] 其中X3 = S3= 0,1,2,3,4表1第二阶段:设将S2个销售点(S2= 0,1,2,3,4)分配给乙丙两个地区时,对每一个S2值,都有一种最优分配方案,使得最大盈利值为: f2(S2)= max[ P2(X2)+ f3(S2 —X2)]其中,X2= 0,1,2,3,42第一阶段:设将S1个销售点(S1 = 4)分配给三个地区时,则最大利润值为: f1(S1)= max[ P1(X1)+ f2(4 —X1)]其中,X1 = 0,1,2,3,4表3然后按计算表格的顺序反推,可知最优分配方案有两个:最大总利润为531)由X1* = 2, X2* = 1, X3* = 1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
M3
C[1,4]=180
C[1,5]=?
(M1 M2) (M3 M4)
C[2,4]=132
C[2,5]=207
M2 (M3M4)
M2 ((M3M4) M5)
C[3,4]=72
C[3,5]=132
(M3M4)
(M3M4) M5
C[4,4] =0
C[4,5]=120
M4
输出:背包所能装物品的最大价值
1. for i←0 to n
2. V[i,0] ←0
3. end for
4. for j←0 to C
5. V[0,j] ←0
6. end for 7. for i←1 to n //前i个物品 8. for j←1 to C //承重量C与物品重量wi均为整数,故j为整数 9. V[i,j] ← V[i-1,j]
M2
53
M3
36
M4
64
M5
45
d 0
d 1
d 2
r1 4, r2 5, r3 3, r4 6, r5 4, r6 5
d 3
d 4
C[1,1]=0 M1
C[1,2]=60 (M1 M2)
C[2,2]=0 M2
C[1,3]=132 (M1 M2) M3 C[2,3]=90
(M4 M5)
C[5,5] =0
M5
C[i,
j]
min{C[i, k
ik j
1] C[k,
j]
ri
rk
rj1}
C[1,
5]
min{C[1,
1k 5
k
1]
C[k
,
5]
r1
rk
r51}
k 2 C[1,5]=C[1,1] C[2,5] r1 r2 r51 0 207 4 5 5 307 M1 (M 2 ((M3 M 4 ) M5 ))
Case 1:
Case 2:
V[i-1,j]
…
j
u1 u2
ui-1
w1 w2
wi-1
v1 v2
vi-1
V[i-1,j-wi] …
u1 u2
ui-1
w1 w2
wi-1
v1 v2
vi-1
j-wi wi
南京理工大学
可重复情形:
方法1:设V[i,j]表示从前i个物品{u1,u2,…,ui}中取出一部分装入承重量为j的背包
min
k 5 C[1,5]=C[1, 4] C[4,5] r1 r5 r51 180 0 4 4 5 260 ((M1 M 2 ) (M3 M 4 )) M5
南京理工大学
可重复背包问题(7.27)
• 给定n个物品{u1,u2,…,un}和一个背包,物品i 的重量为 wi,价值为vi,已知背包的承重量为C,并且每个物品 的个数没有限制。问:在不撑破背包的条件下,选择 哪些物品装入背包,得到的总价值最大?
u1 u2
ui-1 ui
…
?
j
w1 w2
wi-1 wi
v1 v2
vi-1 vi
0 V[i, j] V[i 1, j]
max{V[i 1, j],V[i 1, j wi ] vi}
if i 0 or j 0 if j wi if i 0 and j wi
可重复背包问题的形式化描述: 给定C>0 , wi>0, vi>0, 1≤i≤n, 找出一个n 元的向量 (x1,x2,…,xn),xi为非负整数, 1≤i≤n, 求如下优化问题:
n
max vi xi i 1 n
s.t. wi xi C i 1
南京理工大学
0-1情形:设V[i,j]表示从前i个物品{u1,u2,…,ui}中取出一部分装入承重量为j的背包所能 取得的最大价值。那么,当i=n,j=C时, V[n,C] 就是原问题的解。
所能取得的最大价值。那么,当i=n,j=C时, V[n,C] 就是原问题的解。
u1 u2
ui-1 ui
…
?
j
w1 w2
wi-1 wi
v1 v2
vi-1 vi
V[i, j] V0 [i 1, j]
if i 0 or j 0 if j wi
max{V [i
1,
j], max {V[i 1k j / wi
2. for i ← 0 to n
3. C[i,0] ← 1
4. C[i,i] ← 1
5. end for
6. for i ←2 to n
7. for j ←1 to i-1
8.
C[i,j] ← C[i-1,j-1] + C[i-1,j]
9. end for
10. end for
11. Return C[n,k]
南京理工大学
习题7.3: 给出一个求解二项式系数Cnk的高效算法。你设计的算法的时间复 杂度是什么?
Cnk
1 Cnk11 +Cnk1
, k==0||k==n , 0<k<n
0
1
0
1
1
1
1
2
1
2
1
3
3
1
4
n
2
3
n
1
3
1
6
4
1
南京理工大学
输入:整数n,k 输出:二项式系数Cnk
1. If k==0 || n==k return 1;
k 3 C[1,5]=C[1, 2] C[3,5] r1 r3 r51 60 132 4 35 252 (M1 M 2 ) ((M3 M 4 ) M5 ) k 4 C[1,5]=C[1,3] C[4,5] r1 r4 r51 132 120 4 6 5 372 ((M1 M 2 ) M3) (M 4 M5 )
1,
j
k
*
wi
]
k
* vi }},
if i 0 and j wi
Case 1:
Case 2:
V[i-1,j]
…
j
u1 u2
ui-1
w1 w2
wi-1
v1 v2
vi-1
V[i-1,j-k*wi]
…
j-k*wi
u1 u2
ui-1
w1 w2
wi-1
v1 v2
vi-1
k*wi
南京理工大学
输入:物品集合{u1,u2,…,un},重量分别为w1, w2,…,wn,价值分 别为v1,v2,…,vn, 承重量为C的背包//物品可重复装入
Θ(1) Θ(n)
n i 1
a a 2a .... (n 1)a
i 2 j 1
(n2)
If i=n and j=k then break 不会影响时间复杂度 T(n)=Θ(n2)
南京理工大学 习题7.9: (题略)
M1
45