动态规划47题

合集下载

动态规划资源分配问题

动态规划资源分配问题

S1
7
X1
12
3
4
P1(x1)
44
5
8
F2+ p1 21 19
17 18
f1(s1)
21
X1*
1
• 当k=2时;
f2(s2) = max [p2(x2)+ f3(s3) ]
1< x2 < s2 3< s2< 6 计算结果:
S2 X2 p2(x2) F3+ p2 f2(s2) X2*
34 1 12 3 35 10 12 12 10 12 1 1或2
f(k* sk ) max{ fk (sk , xk )}
xk 1,2,3...,sk
4
xi sk
ik
xi大于等于1且为整数
将递推关系写出即是
f
* k
(
sk
)
xk
max
1, 2 ,..., sk
{Pk
(
xk
)
f
* k 1
(
sk
xk )}
f(5* s5)=0
k 1,2,3
当k=4时;
f4(s4) = max [p4(x4)]
S3 X3 p3(x3) F3+ p3 f3(s3) X3*
23 1 12 5 56 7 98 79 11
4 123 568 12 10 10 12 1
5 1 2 34 5 6 88 13 13 12 10 13 1或2
• 当k=1时;
f1(s1) = max [p1(x1)+ f2(s2) ]
1< x1< s1 s1=7 计算结果:
5 123 35 6 15 14 13 15 1

动态规划例1求解下列整数规划的最优解

动态规划例1求解下列整数规划的最优解

例1 求解下列整数规划的最优解:()123123max 45634510..01,2,3,j j Z x x x x x x s t x j x =++++⎧⎪⎨=⎪⎩≤≥为整数.解 (1)建立动态规划模型:阶段变量:将给每一个变量j x 赋值看成一个阶段,划分为3个阶段,且阶段变量k=1,2,3. 设状态变量k s 表示从第k 阶段到第3阶段约束右端最大值,则10.j s = 设决策变量k x 表示第k 阶段赋给变量k x 的值(1,2,3)k =. 状态转移方程:2113223,4.s s x s s x =-=-阶段指标:111122223333(,)4,(,)5,(,)6.u s x x u s x x u s x x === 基本方程;()(){}()3113,2,1044()max ,()0.s k k k k k k k k k k x a f s u s x f s f s ++⎡⎤=⎢⎥⎢⎥⎣⎦⎧=+⎪⎨⎪=⎩≤≤ 其中1233,4, 5.a a a === (1) 用逆序法求解: 当3k =时,()(){}{}33333443330055max 6max 6,ssx x f s x f s x ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦=+=≤≤≤而{}[]30,1,2,3,4,5,6,7,8,9,10.s x ∈表示不超过x 的最大整数。

因此,当30,1,2,3,4s =时,30x =;当35,6,7,8,9s =时,3x 可取0或1;当310s =时,3x 可取0,1,2,由此确定()33.f s 现将有关数据列入表4.1中当时,有()(){}(){}22222332322220044max 5max 54,ssx x f s xf s xf s x ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦=+=+-≤≤≤≤而{}20,1,2,3,4,5,6,7,8,9,10s ∈。

所以当20,1,2,3s =时,20x =;当24,5,6,7s =时,201x =或;当28,9,10s =时20,1,2x =。

算法习题——精选推荐

算法习题——精选推荐

算法习题算法设计与分析试卷⼀、填空题(20分,每空2分)1、算法的性质包括输⼊、输出、确定性、有限性。

2、动态规划算法的基本思想就将待求问题分解成若⼲个⼦问题、先求解⼦问题,然后从这些⼦问题的解得到原问题的解。

3、设计动态规划算法的4个步骤:(1)找出最优解的性质,并刻画其结构特征。

(2)递归地定义最优值。

(3)以⾃底向上的⽅式计算出最优值。

(4)根据计算最优值得到的信息,构造最优解。

4、流⽔作业调度问题的johnson算法:(1)令N1={i|ai=bj};(2)将N1中作业依ai的ai的⾮减序排序;将N2中作业依bi的⾮增序排序。

5、对于流⽔作业⾼度问题,必存在⼀个最优调度π,使得作业π(i)和π(i+1)满⾜Johnson不等式min{bπ(i),aπ(i+1)}≥min{bπ(i+1),aπ(i)}。

6、最优⼆叉搜索树即是最⼩平均查找长度的⼆叉搜索树。

⼆、综合题(50分)1、当(a1,a2,a3,a4,a5,a6)=(-2,11,-4,13,-5,-2)时,最⼤⼦段和为∑ak(2<=k<=4)=20(5分)2、由流⽔作业调度问题的最优⼦结构性质可知,T(N,0)=min{ai+T(N-{i},bi)}(1=3、最⼤⼦段和问题的简单算法(10分)int maxsum(int n,int *a,int & bestj){Int sum=0;for (int i=1;i<=n;i++)for (int j=i;j<=n;j++)int thissum=0;for(int k=i;k<=j;k++)this sum+=a[k];if(thissum>sum){sum=thissum;besti=i;bestj=j;}}return sum;}4、设计最优⼆叉搜索树问题的动态规划算法OptimalBinarysearchTree? (15分)Void OptimalBinarysearchTree(int a,int n,int * * m, int * * w){for(int i=0;i<=n;i++) {w[i+1][i]=a[i]; m[i+1][i]= 0;}for(int r=0;rfor(int i=1;i<=n-r;i++){int j=i+r;w[i][j]=w[i][j-1]+a[j]+b[j];m[i][j]= m[i+1][j];s[i][j]=i;for(int k=i+1;k<=j;k++){int t=m[i][k-1]+m[k+1][j];if(t}m[i][j]=t; s[i][j]=k;}}5、设n=4, (a1,a2,a3,a4)=(3,4,8,10), (b1,b2,b3,b4)=(6,2,9,15) ⽤两种⽅法求4个作业的最优调度⽅案并计算其最优值?(15分)法⼀:min(ai,bj)<=min(aj,bi)因为min(a1,b2)<=min(a2,b1)所以1→2 (先1后2)由min(a1,b3)<=min(a3,b1)得1→3 (先1后3)同理可得:最后为1→3→4→2法⼆:johnson算法思想N1={1,3,4} N2={2}N11={1,3,4} N12={2}所以N11→N12得:1→3→4→2三、简答题(30分)1、将所给定序列a[1:n]分为长度相等的两段a[1:n/2]和a[n/2+1:n],分别求出这两段的最⼤⼦段和,则a[1:n]的最⼤⼦段和有哪三种情形?(10分)答:(1)a[1:n]的最⼤⼦段和与a[1:n/2]的最⼤⼦段和相同。

动态规划状态转移方程

动态规划状态转移方程

1.资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k])2.资源问题2------01背包问题F[I,j]:=max(f[i-1,j-v[i]]+w[i],f[i-1,j]);3.线性动态规划1-----朴素最长非降子序列F[i]:=max{f[j]+1}4.剖分问题1-----石子合并F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]);5.剖分问题2-----多边形剖分F[I,j]:=min(f[i,k]+f[k,j]+a[k]*a[j]*a[i]);6.剖分问题3------乘积最大f[i,j]:=max(f[k,j-1]*mult[k,i]);7.资源问题3-----系统可靠性(完全背包)F[i,j]:=max{f[i-1,j-c[i]*k]*P[I,x]}8.贪心的动态规划1-----快餐问题F[i,j,k]:=max{f[i-1,j',k']+(T[i]-(j-j')*p1-(k-k')*p2) div p3}9.贪心的动态规划2-----过河f[i]=min{{f(i-k)} (not stone[i]){f(i-k)}+1} (stone[i]); +贪心压缩状态10.剖分问题4-----多边形-讨论的动态规划F[i,j]:=max{正正 f[I,k]*f[k+1,j];负负 g[I,k]*f[k+1,j];正负 g[I,k]*f[k+1,j];负正 f[I,k]*g[k+1,j];} g为min11.树型动态规划1-----加分二叉树 (从两侧到根结点模型)F[I,j]:=max{f[I,k-1]*f[k+1,j]+c[k]}12.树型动态规划2-----选课 (多叉树转二叉树,自顶向下模型)F[I,j]表示以i为根节点选j门功课得到的最大学分f[i,j]:=max{f[t[i].l,k]+f[t[i].r,j-k-1]+c[i]}13.计数问题1-----砝码称重f[f[0]+1]=f[j]+k*w[j];(1<=i<=n; 1<=j<=f[0]; 1<=k<=a[i];)14.递推天地1------核电站问题f[-1]:=1; f[0]:=1;f[i]:=2*f[i-1]-f[i-1-m]15.递推天地2------数的划分f[i,j]:=f[i-j,j]+f[i-1,j-1];16.最大子矩阵1-----一最大01子矩阵f[i,j]:=min(f[i-1,j],v[i,j-1],v[i-1,j-1])+1;ans:=maxvalue(f);17.判定性问题1-----能否被4整除g[1,0]:=true; g[1,1]:=false; g[1,2]:=false; g[1,3]:=false; g[i,j]:=g[i-1,k] and ((k+a[i,p]) mod 4 = j)18.判定性问题2-----能否被k整除f[I,j±n[i] mod k]:=f[i-1,j]; -k<=j<=k; 1<=i<=n20.线型动态规划2-----方块消除游戏f[i,i-1,0]:=0f[i,j,k]:=max{f[i,j-1,0]+sqr(len(j)+k),f[i,p,k+len[j]]+f[p+1,j-1,0]}ans:=f[1,m,0]21.线型动态规划3-----最长公共子串,LCS问题f[i,j]={0(i=0)&(j=0);f[i-1,j-1]+1(i>0,j>0,x[i]=y[j]);max{f[i,j-1]+f[i-1,j]}} (i>0,j>0,x[i]<>y[j]);22.最大子矩阵2-----最大带权01子矩阵O(n^2*m)枚举行的起始,压缩进数列,求最大字段和,遇0则清零23. 资源问题4-----装箱问题(判定性01背包)f[j]:=(f[j] or f[j-v[i]]);24.数字三角形1-----朴素の数字三角形f[i,j]:=max(f[i+1,j]+a[I,j],f[i+1,j+1]+a[i,j]);25.数字三角形2-----晴天小猪历险记之Hill同一阶段上暴力动态规划if[i,j]:=min(f[i,j-1],f[I,j+1],f[i-1,j],f[i-1,j-1])+a[i,j]26.双向动态规划1数字三角形3-----小胖办证f[i,j]:=max(f[i-1,j]+a[i,j],f[i,j-1]+a[i,j],f[i,j+1]+a[i,j])27. 数字三角形4-----过河卒//边界初始化f[i,j]:=f[i-1,j]+f[i,j-1];28.数字三角形5-----朴素的打砖块f[i,j,k]:=max(f[i-1,j-k,p]+sum[i,k],f[i,j,k]);29.数字三角形6-----优化的打砖块f[I,j,k]:=max{g[i-1,j-k,k-1]+sum[I,k]}30.线性动态规划3-----打鼹鼠’f[i]:=f[j]+1;(abs(x[i]-x[j])+abs(y[i]-y[j])<=t[i]-t[j])31.树形动态规划3-----贪吃的九头龙⎭⎬⎫⎩⎨⎧======⎭⎬⎫⎩⎨⎧+-++--+=0))2()0(&)0(())1(&)1((1],[]][,[*]0,[],',[]0,',[]][,[*]1,[],1',[]1,',[min ],,[m and j i or j i j i d i p i w k d k j j r f j l f i p i w k d k j j r f j l f k j i f32.状态压缩动态规划1-----炮兵阵地Max(f[Q*(r+1)+k],g[j]+num[k])If (map[i] and plan[k]=0) and((plan[P] or plan[q]) and plan[k]=0)33.递推天地3-----情书抄写员f[i]:=f[i-1]+k*f[i-2]34.递推天地4-----错位排列f[i]:=(i-1)(f[i-2]+f[i-1]);f[n]:=n*f[n-1]+(-1)^(n-2);35.递推天地5-----直线分平面最大区域数f[n]:=f[n-1]+n:=n*(n+1) div 2 + 1;36.递推天地6-----折线分平面最大区域数f[n]:=(n-1)(2*n-1)+2*n;37.递推天地7-----封闭曲线分平面最大区域数f[n]:=f[n-1]+2*(n-1):=sqr(n)-n+2;38递推天地8-----凸多边形分三角形方法数f[n]:=C(2*n-2,n-1) div n;对于k 边形f[k]:=C(2*k-4,k-2) div (k-1); //(k>=3)39递推天地9-----Catalan 数列一般形式1,1,2,5,14,42,132f[n]:=C(2k,k) div (k+1);40递推天地10-----彩灯布置排列组合中的环形染色问题f[n]:=f[n-1]*(m-2)+f[n-2]*(m-1); (f[1]:=m; f[2]:=m(m-1);41线性动态规划4-----找数线性扫描sum:=f[i]+g[j];(if sum=Aim then getout; if sum<Aim then inc(i) else inc(j);)42线性动态规划5-----隐形的翅膀min:=min{abs(w[i]/w[j]-gold)};if w[i]/w[j]<gold then inc(i) else inc(j);43剖分问题5-----最大奖励f[i]:=max(f[i],f[j]+(sum[j]-sum[i])*i-t44最短路1-----Floydf[i,j]:=max(f[i,j],f[i,k]+f[k,j]);ans[q[i,j,k]]:=ans[q[i,j,k]]+s[i,q[i,j,k]]*s[q[i,j,k],j]/s[i,j];45 剖分问题6-----小H 的小屋F[l,m,n]:=f[l-x,m-1,n-k]+S(x,k);46 计数问题2-----陨石的秘密(排列组合中的计数问题)Ans[l1,l2,l3,D]:=f[l1+1,l2,l3,D+1]-f[l1+1,l2,l3,D];F[l1,l2,l3,D]:=Sigma(f[o,p,q,d-1]*f[l1-o,l2-p,l3-q,d]);47 线性动态规划------合唱队形两次F[i]:=max{f[j]+1}+枚举中央结点48 资源问题------明明的预算方案:加花的动态规划f[i,j]:=max(f[i,j],f[l,j-v[i]-v[fb[i]]-v[fa[i]]]+v[i]*p[i]+v[fb[i]]*p[fb[i]]+v[fa[i]]*p[fa[i]]);49 资源问题-----化工场装箱员[,[1,],[1,]][,,]:min [,[1,],[1,]]1[10,[1,10],[1,10]f n i getA n n i j getB n n i f n i j f n j i getA n n j getB n n j f n i j i getA n n i j j getB n n i j ++++++⎧⎫⎪⎪=+++++++⎨⎬⎪⎪+--+++--+++--⎩⎭-----聚会的快乐f[i,2]:=max(f[i,0],f[i,1]);f[i,1]:=sigma(f[t[i]^.son,0]);f[i,0]:=sigma(f[t[i]^.son,3]);51树形动态规划-----皇宫看守f[i,2]:=max(f[i,0],f[i,1]);f[i,1]:=sigma(f[t[i]^.son,0]);f[i,0]:=sigma(f[t[i]^.son,3]);52递推天地-----盒子与球f[i,1]:=1;f[i,j]:=j*(f[i-1,j-1]+f[i-1,j]);53双重动态规划-----有限的基因序列f[i]:=min{f[j]+1}g[c,i,j]:=(g[a,i,j] and g[b,i,j]) or (g[c,i,j])54最大子矩阵问题-----居住空间f[i,j,k]:=min(min(min(f[i-1,j,k],f[i,j-1,k]),min(f[i,j,k-1],f[i-1,j-1,k])),min(min(f[i-1,j,k-1],f[i,j-1,k-1]),f[i-1,j-1,k-1]))+1;55线性动态规划------日程安排f[i]:=max{f[j]}+P[I]; (e[j]<s[i])56递推天地------组合数C[I,j]:=C[i-1,j]+C[I-1,j-1]C[I,0]:=157树形动态规划-----有向树k中值问题F[I,r,k]:=max{max{f[l[i],I,j]+f[r[i],I,k-j-1]},f[f[l[i],r,j]+f[r[i],r,k-j]+w[I,r]]}58树形动态规划-----CTSC 2001选课F[I,j]:=w[i](if i∈P)+f[l[i],k]+f[r[i],m-k](0≤k≤m)(if l[i]<>0)-----多重历史f[i,j]:=sigma{f[i-k,j-1]}(if checked)60背包问题(+-1背包问题+回溯)-----CEOI1998 Substractf[i,j]:=f[i-1,j-a[i]] or f[i-1,j+a[i]]61线性动态规划(字符串)-----NOI 2000 古城之谜f[i,1,1]:=min{f[i+length(s),2,1],f[i+length(s),1,1]+1}f[i,1,2]:=min{f[i+length(s),1,2]+words[s],f[i+length(s),1,2]+words[s]}62线性动态规划-----最少单词个数f[i,j]:=max{f[I,j],f[u-1,j-1]+l}63线型动态规划-----APIO2007 数据备份状态压缩+剪掉每个阶段j前j*2个状态和j*2+200后的状态贪心动态规划f[i]:=min(g[i-2]+s[i],f[i-1]);64树形动态规划-----APIO2007 风铃f[i]:=f[l]+f[r]+{1 (if c[l]<c[r])}g[i]:=1(d[l]<>d[r]) 0(d[l]=d[r])g[l]=g[r]=1 then Halt;65地图动态规划-----NOI 2005 adv19910F[t,i,j]:=max{f[t-1,i-dx[d[[t]],j-dy[d[k]]]+1],f[t-1,i,j];66地图动态规划-----优化的NOI 2005 adv19910F[k,i,j]:=max{f[k-1,i,p]+1} j-b[k]<=p<=j;67目标动态规划-----CEOI98 subtraF[I,j]:=f[I-1,j+a[i]] or f[i-1,j-a[i]]68目标动态规划----- Vijos 1037搭建双塔问题F[value,delta]:=g[value+a[i],delta+a[i]] or g[value,delta-a[i]]69树形动态规划-----有线电视网f[i,p]:=max(f[i,p],f[i,p-q]+f[j,q]-map[i,j])leaves[i]>=p>=l, 1<=q<=p;70地图动态规划-----vijos某题F[I,j]:=min(f[i-1,j-1],f[I,j-1],f[i-1,j]);71最大子矩阵问题-----最大字段和问题f[i]:=max(f[i-1]+b[i],b[i]); f[1]:=b[1]72最大子矩阵问题-----最大子立方体问题枚举一组边i的起始,压缩进矩阵 B[I,j]+=a[x,I,j]枚举另外一组边的其实,做最大子矩阵73括号序列-----线型动态规划f[I,j]:=min(f[I,j],f[i+1,j-1](s[i]s[j]=”()”or(”[]”)),f[I+1,j+1]+1 (s[j]=”(”or”[” ] , f[I,j-1]+1(s[j]=”)”or”]” )74棋盘切割-----线型动态规划f[k,x1,y1,x2,y2]=min{min{f[k-1,x1,y1,a,y2]+s[a+1,y1,x2,y2],f[k-1,a+1,y1,x2,y2]+s[x1,y1,a,y2]min{}}75概率动态规划-----聪聪和可可(NOI2005)x:=p[p[i,j],j]f[I,j]:=(f[x,b[j,k]]+f[x,j])/(l[j]+1)+1f[I,i]=0f[x,j]=176概率动态规划-----血缘关系F[A, B]=(f[A0, B]+P[A1, B])/2f[I,i]=1f[I,j]=0(I,j无相同基因)77线性动态规划-----决斗F[I,j]=(f[I,j] and f[k,j]) and (e[I,k] or e[j,k]),i<k<j78线性动态规划-----舞蹈家F[x,y,k]=min(f[a[k],y,k+1]+w[x,a[k]],f[x,a[k],k+1]+w[y,a[k]])79线性动态规划-----积木游戏F[I,a,b,k]=max(f[I,a+1,b,k],f[i+1,a+1,a+1,k’],f[I,a+1,a+1,k’])80树形动态规划(双次记录)-----NOI2003 逃学的小孩朴素的话枚举节点i和离其最远的两个节点 j,k O(n^2)每个节点记录最大的两个值,并记录这最大值分别是从哪个相邻节点传过来的。

动态规划实现最短路径问题

动态规划实现最短路径问题

动态规划实现最短路径问题⼀、设计最短路径的动态规划算法 <算法导论>中⼀般将设计动态规划算法归纳为下⾯⼏个步骤: 1)分析最优解的结构 2)递归定义最优解的值 3)⾃底向上计算最优解的值 4)从计算的最优解的值上⾯构建出最优解⼆、最短路径的结构 从最优解的结构开始分析(我们假设没有权值为负的路径),对于图G<V,E>的所有结点对最短路径的问题,我们能知道⼀条最短路径的⼦路径都是最短路径。

假设⽤邻接矩阵W=w(ij)来表⽰输⼊带权图,考虑从结点i到结点j的⼀条最短路径p,如果p最多有m(m为有限值)条边。

若i=j,则p的权值为0⽽且不包含其他边。

若i ≠ j,可以将i到j的路径转换为i -> k、k->j。

三、⼀个给定的图 1)给定⼀个有向图 2)我们可以给出这个有向图的邻接矩阵四、C++实现1 #include <iostream>2 #include<fstream>3 #include<sstream>4 #include<vector>5 #include<string>6using namespace std;7const int Max_Num = 100;89 typedef struct Point {10int n; //点的个数11double p[Max_Num];12double q[Max_Num];13int root[Max_Num][Max_Num];14double w[Max_Num][Max_Num];15double e[Max_Num][Max_Num];16 }Point;1718 vector<Point> points;19 vector<string> res;20 vector<int> num;2122void file_read();23void createPoint();24void optimalBST();25void printRoot(Point P);26void printOptimalBST(int i, int j, int r, Point P, ofstream &fileWrite);27 template <class Type>28 Type stringToNum(const string& str) {29 istringstream iss(str);30 Type num;31 iss >> num;32 iss.str("");33return num;34 }3536void file_read() {37string str2, str1 = "", result;38 ifstream fileRead("in.dat");39if (fileRead.is_open()) {40while (getline(fileRead, str2, '\n')) {41if (str2.find("") != -1) {42 str1.append(str2 + "");43 }44else {45 num.push_back(stringToNum<int>(str2));46if (str1 != "") {47 res.push_back(str1);48 }49 str1 = "";50 }51 }52 res.push_back(str1);53 fileRead.close();54 }55 }5657void createPoint() {58string temp;59 Point P;60for (int i = 0; i < res.size(); i++) {61 vector<string> temp_str; //存放按照空格分开后的数字62int n = num[i];63 stringstream input(res[i]);64while (input >> temp) {65 temp_str.push_back(temp);66 }67 P.n = n;68for(int k = 0; k<=n; k++) P.p[k] = stringToNum<double>(temp_str[k]);69for(int k = n + 1; k<temp_str.size(); k++) P.q[k-(n+1)] = stringToNum<double>(temp_str[k]);70 points.push_back(P);71 }72 }7374//根据书上的伪代码:接收概率列表p1....pn和q0.....qn以及规模n作为输⼊计算出e和root75void optimalBST(){76 Point P;77for(int i = 0; i<res.size(); i++) {78 vector<string> temp_str; //存放按照空格分开后的数字79int n = num[i];80string temp;81 stringstream input(res[i]);82while (input >> temp) {83 temp_str.push_back(temp);84 }85 P.n = n;8687for(int k = 0; k<=n; k++) P.p[k] = stringToNum<double>(temp_str[k]);88for(int k = n + 1; k<temp_str.size(); k++) P.q[k-(n+1)] = stringToNum<double>(temp_str[k]); 8990//初始化只包括虚拟键的⼦树91for (int i = 1;i <= P.n + 1;++i){92 P.w[i][i-1] = P.q[i-1];93 P.e[i][i-1] = P.q[i-1];94 }95//由下到上,由左到右逐步计算96for (int len = 1;len <= P.n;++len){97for (int i = 1;i <= P.n - len + 1;++i){98int j = i + len - 1;99 P.e[i][j] = Max_Num;100 P.w[i][j] = P.w[i][j-1] + P.p[j] + P.q[j];101//求取最⼩代价的⼦树的根102for (int r = i;r <= j;++r)103 {104double temp = P.e[i][r-1] + P.e[r+1][j] + P.w[i][j];105if (temp < P.e[i][j])106 {107 P.e[i][j] = temp;108 P.root[i][j] = r;109 }110 }111 }112 }113 points.push_back(P);114 }115 }116117void printOptimalBST(int i, int j, int r, Point P, ofstream &fileWrite){118int root_node = P.root[i][j];//⼦树根节点119if (root_node == P.root[1][P.n]){120//输出整棵树的根121 fileWrite << "k" << root_node << "是根" << endl;122 printOptimalBST(i, root_node - 1, root_node, P, fileWrite);123 printOptimalBST(root_node +1 , j, root_node, P, fileWrite);124return;125 }126127if (j < i - 1){128return;129 }else if (j == i - 1){//遇到虚拟键130if (j < r)131 fileWrite << "d" << j << "是" << "k" << r << "的左孩⼦" << endl;132else133 fileWrite << "d" << j << "是" << "k" << r << "的右孩⼦" << endl;134return;135 }136else{//遇到内部结点137if (root_node < r)138 fileWrite << "k" << root_node << "是" << "k" << r << "的左孩⼦" << endl; 139else140 fileWrite << "k" << root_node << "是" << "k" << r << "的右孩⼦" << endl; 141 }142 printOptimalBST(i, root_node - 1, root_node, P, fileWrite);143 printOptimalBST(root_node + 1, j, root_node, P, fileWrite);144 }145146//输出最优⼆叉查找树所有⼦树的根147void printRoot(Point P){148 cout << "各⼦树的根:" << endl;149for (int i = 1;i <= P.n;++i){150for (int j = 1;j <= P.n;++j){151 cout << P.root[i][j] << "";152 }153 cout << endl;154 }155 cout << endl;156 }157158int main(){159 file_read();160 optimalBST();161 ofstream fileWrite("out.dat");162 Point P ;163for(int i = 0; i<points.size(); i++) {164 P = points[i];165 printRoot(P);166 printOptimalBST(1,P.n,-1, P, fileWrite);167 }168 fileWrite.clear();169return0;170 } 上述代码是将给定的邻接矩阵从⽂件中读取 然后根据输⼊的邻接矩阵求出最短路径。

(完整版)运筹学》习题答案运筹学答案

(完整版)运筹学》习题答案运筹学答案

《运筹学》习题答案一、单选题1.用动态规划求解工程线路问题时,什么样的网络问题可以转化为定步数问题求解()BA.任意网络B.无回路有向网络C.混合网络D.容量网络2.通过什么方法或者技巧可以把工程线路问题转化为动态规划问题?()BA.非线性问题的线性化技巧B.静态问题的动态处理C.引入虚拟产地或者销地D.引入人工变量3.静态问题的动态处理最常用的方法是?BA.非线性问题的线性化技巧B.人为的引入时段C.引入虚拟产地或者销地D.网络建模4.串联系统可靠性问题动态规划模型的特点是()DA.状态变量的选取B.决策变量的选取C.有虚拟产地或者销地D.目标函数取乘积形式5.在网络计划技术中,进行时间与成本优化时,一般地说,随着施工周期的缩短,直接费用是( )。

CA.降低的B.不增不减的C.增加的D.难以估计的6.最小枝权树算法是从已接接点出发,把( )的接点连接上CA.最远B.较远C.最近D.较近7.在箭线式网络固中,( )的说法是错误的。

DA.结点不占用时间也不消耗资源B.结点表示前接活动的完成和后续活动的开始C.箭线代表活动D.结点的最早出现时间和最迟出现时间是同一个时间8.如图所示,在锅炉房与各车间之间铺设暖气管最小的管道总长度是( )。

CA.1200B.1400C.1300D.17009.在求最短路线问题中,已知起点到A,B,C三相邻结点的距离分别为15km,20km,25km,则()。

DA.最短路线—定通过A点B.最短路线一定通过B点C.最短路线一定通过C点D.不能判断最短路线通过哪一点10.在一棵树中,如果在某两点间加上条边,则图一定( )AA.存在一个圈B.存在两个圈C.存在三个圈D.不含圈11.网络图关键线路的长度( )工程完工期。

CA.大于B.小于C.等于D.不一定等于12.在计算最大流量时,我们选中的每一条路线( )。

CA.一定是一条最短的路线B.一定不是一条最短的路线C.是使某一条支线流量饱和的路线D.是任一条支路流量都不饱和的路线13.从甲市到乙市之间有—公路网络,为了尽快从甲市驱车赶到乙市,应借用()CA.树的逐步生成法B.求最小技校树法C.求最短路线法D.求最大流量法14.为了在各住宅之间安装一个供水管道.若要求用材料最省,则应使用( )。

动态规划思想:石子合并问题

动态规划思想:石子合并问题

动态规划思想:⽯⼦合并问题描述:在⼀个圆形操场的四周摆放着n 堆⽯⼦。

现要将⽯⼦有次序地合并成⼀堆。

规定每次只能选相邻的2 堆⽯⼦合并成新的⼀堆,并将新的⼀堆⽯⼦数记为该次合并的得分。

试设计⼀个算法,计算出将n堆⽯⼦合并成⼀堆的最⼩得分和最⼤得分。

开始以为通过贪⼼算法可能很快解决问题,可是是⾏不通的。

⾸先我们可以把这么堆⽯⼦看成⼀列我们假如5堆的⽯⼦,其中⽯⼦数分别为7,6,5,7,100•按照贪⼼法,合并的过程如下:每次合并得分第⼀次合并 7 6 5 7 100 =11 第⼆次合并 7 11 7 100=18 第三次合并 18 7 100 =25第四次合并 25 100 =125总得分=11+18+25+125=179•另⼀种合并⽅案每次合并得分 第⼀次合并 7 6 5 7 100 ->13第⼆次合并 13 5 7 100->12第三次合并 13 12 100 ->25第四次合并 25 100 ->125总得分=13+12+25+125=175显然利⽤贪⼼来做是错误的,贪⼼算法在⼦过程中得出的解只是局部最优,⽽不能保证使得全局的值最优。

如果N-1次合并的全局最优解包含了每⼀次合并的⼦问题的最优解,那么经这样的N-1次合并后的得分总和必然是最优的。

因此我们需要通过动态规划算法来求出最优解。

在此我们假设有n堆⽯⼦,⼀字排开,合并相邻两堆的⽯⼦,每合并两堆⽯⼦得到⼀个分数,最终合并后总分数最少的。

我们设m(i,j)定义为第i堆⽯⼦到第j堆⽯⼦合并后的最少总分数。

a(i)为第i堆⽯⼦得⽯⼦数量。

当合并的⽯⼦堆为1堆时,很明显m(i,i)的分数为0; 当合并的⽯⼦堆为2堆时,m(i,i+1)的分数为a(i)+a(i+1); 当合并的⽯⼦堆为3堆时,m(i,i+2)的分数为MIN((m(i,i)+m(i+1,i+2)+sum(i,i+2)),(m(i,i+1)+m(i+2,i+2)+sum(i,i+2)); 当合并的⽯⼦堆为4堆时......代码实现如下:1 #include<stdio.h>2#define N 1003/*4 *求合并过程中5 *最少合并堆数⽬6 **/7int MatrixChain_min(int p[N],int n)8 {9//定义⼆维数组m[i][j]来记录i到j的合并过成中最少⽯⼦数⽬10 //此处赋值为-11112int m[N][N];13for(int x=1;x<=n;x++)14for(int z=1;z<=n;z++)15 {16 m[x][z]=-1;17 }1819int min=0;2021//当⼀个单独合并时,m[i][i]设为0,表⽰没有⽯⼦22for(int g = 1;g<=n;g++) m[g][g]=0;2324//当相邻的两堆⽯⼦合并时,此时的m很容易可以看出是两者之和25for(int i=1;i<=n-1;i++)26 {27int j=i+1;28 m[i][j]=p[i]+p[j];29 }3031//当相邻的3堆以及到最后的n堆时,执⾏以下循环32for(int r=3; r<=n;r++)33for(int i=1;i<=n-r+1;i++)34 {35int j = i+r-1; //j总是距离i r-1的距离36int sum=0;37//当i到j堆⽯⼦合并时最后⾥⾯的⽯⼦数求和得sum38for(int b=i;b<=j;b++)39 sum+=p[b];4041// 此时m[i][j]为i~j堆⽯⼦间以m[i][i]+m[i+1][j]+sum结果,这是其中⼀种可能,不⼀定是最优42 //要与下⾯的情况相⽐较,唉,太详细了4344 m[i][j] = m[i+1][j]+sum;4546//除上⾯⼀种组合情况外的其他组合情况47for(int k=i+1;k<j;k++)48 {49int t=m[i][k]+m[k+1][j]+sum;50if(t<m[i][j])51 m[i][j] = t;5253 }54 }55//最终得到最优解56 min=m[1][n];57return min;585960 }6162/*63 *求合并过程中64 *最多合并堆数⽬65 **/6667int MatrixChain_max(int p[N],int n)68 {69int m[N][N];70for(int x=1;x<=n;x++)71for(int z=1;z<=n;z++)72 {73 m[x][z]=-1;74 }757677int max=0;78//⼀个独⾃组合时79for(int g = 1;g<=n;g++) m[g][g]=0;80//两个两两组合时81for(int i=1;i<=n-1;i++)82 {83int j=i+1;84 m[i][j]=p[i]+p[j];85 }8687for(int r=3; r<=n;r++)88for(int i=1;i<=n-r+1;i++)89 {90int j = i+r-1;91int sum=0;92for(int b=i;b<=j;b++)93 sum+=p[b];94 m[i][j] = m[i+1][j]+sum;9596for(int k=i+1;k<j;k++)97 {98int t=m[i][k]+m[k+1][j]+sum;99if(t>m[i][j])100 m[i][j] = t;101102 }103 }104105 max=m[1][n];106return max;107108109 }110int main()111 {112int stone[N];113int min=0;114int max=0;115int n;116 scanf("%d",&n);117for(int i=1;i<=n;i++)118 scanf("%d",&stone[i]);119120 min= MatrixChain_min(stone,n);121 max= MatrixChain_max(stone,n);122123//因为题⽬要求圆的原因,要把所有情况都要考虑到,总共有n种情况。

【java】矩阵的最大子矩阵(动态规划)

【java】矩阵的最大子矩阵(动态规划)

【java】矩阵的最⼤⼦矩阵(动态规划)⼀、实验⽬的练习使⽤动态规划算法解决实际问题(使⽤Java语⾔实现)。

⼆、实验内容【问题描述】有⼀个包含正数和负数的⼆维数组。

⼀个⼦矩阵是指在该⼆维数组⾥,任意相邻的下标是1*1或更⼤的⼦数组。

⼀个⼦矩阵的和是指该⼦矩阵中所有元素的和。

本题中,把具有最⼤和的⼦矩阵称为最⼤⼦矩阵。

【⽰例】给出以下⼆维数组:0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2这个数组的最⼤⼦矩阵为:9 2-4 1-1 8其和为15。

【输⼊】输⼊包含多组测试数据。

每组输⼊的第⼀⾏是⼀个正整数N(1<=N<=100),表⽰⼆维⽅阵的⼤⼩。

接下来N⾏每⾏输⼊N个整数,表⽰数组元素,范围为[-127,127]。

【输出】输出最⼤⼦矩阵和。

【思路提⽰】求最⼤⼦矩阵和问题是求最⼤⼦段和问题在⼆维空间上的推⼴,可参考求最⼤⼦段和问题。

三、 程序代码(1)maxSumList1package maxSumList;2import java.util.Scanner;34public class maxList{5 //public static int[][] list=new int[10][10];6 static int n;7 private maxSingleList maxSingleList=new maxSingleList();8 private final maxSingleList[] maxSingleLists;9 private int numberOfmaxSingleLists;1011 public maxList() {12 //创建计算每个⼦段和的类的数组13 maxSingleLists=new maxSingleList[100];14 }15161617 public void InputList(int[][] list){1819 System.out.println("请输⼊⽅阵⼤⼩:");20 Scanner scanner=new Scanner(System.in);21 n=scanner.nextInt();22 for (int y=0;y<n;y++){23 System.out.println("请输⼊⽅阵第"+(y+1)+"⾏数据:");24 for (int x=0;x<n;x++)25 list[y][x]=scanner.nextInt();26 }27 }28 public void OutputMaxSumList(int[][] list){29 int m=0;30 int max=0;31 int max1=0;32 int maxnum=0;3334 for (m=0;m<=numberOfmaxSingleLists;m++) {35 max1=maxSingleLists[m].getSum();36 if (max1 > max) {37 max = max1;38 maxnum = m;39 }40 }41 System.out.println("请输出最⼤⼦段和:"+maxSingleLists[maxnum].getSum());42 System.out.println("请输出最⼤⼦段:");43 for(int i=maxSingleLists[maxnum].getY1();i<=maxSingleLists[maxnum].getY2();i++){44 for (int j=maxSingleLists[maxnum].getNum1();j<=maxSingleLists[maxnum].getNum2();j++){45 System.out.print(list[i][j]+" ");46 }47 System.out.println("\n");48 }49 }5051 public void subMaxList(int[][] matrix) {52 int m=0;53 int[][] total = new int[10][10];54 for (int y=0;y<n;y++){55 for (int x=0;x<n;x++)56 total[y][x]=matrix[y][x];57 }585960 for (int i = 1; i < n; i++) {61 for (int j = 0; j < n; j++) {62 total[i][j] += total[i-1][j];63 }64 }6566 int maximum = 0;//Integer.MIN_VALUE;67 for (int i = 0; i < n; i++) {//所在的list⾏68 for (int j = i; j <n; j++) {//相差的69 //result 保存的是从 i ⾏到第 j ⾏所对应的矩阵上下值的和70 int[] result = new int[matrix[0].length];//每次都重新定义存放⼦段和的结果数组71 for (int f = 0; f < n; f++) {72 if (i == 0) {73 result[f] = total[j][f];74 } else {75 result[f] = total[j][f] - total[i - 1][f];76 }77 }78 maxSingleList maxSingleList=new maxSingleList();79 int maximal=maxSingleList.MaxListNum(result,i,j);80 numberOfmaxSingleLists=m;81 maxSingleLists[m++]= maxSingleList;81 maxSingleLists[m++]= maxSingleList;82 if (maximal > maximum) {83 maximum = maximal;84 }85 }86 }87 }8889}(2)maxSingleList4 private int num1;5 private int num2;6 private int y1;7 private int y2;8 private int sum;9 public int getNum1(){10 return num1;11 }12 public int getNum2(){13 return num2;14 }15 public void setY1(int y11){16 y1=y11;17 }18 public void setY2(int y22){19 y2=y22;20 }21 public int getY1(){22 return y1;23 }24 public int getY2(){25 return y2;26 }27 public void setSum(int sum){28 this.sum=sum;29 }30 public int getSum(){31 return sum;32 }33 public int MaxListNum(int[] array,int i,int j){34 int number,b=0,begin=0,bestmin=0,bestmax=0;35 sum=0;36 for (number = 0; number < array.length; number++) {//sum没清零37 if (b >= 0)//去掉等号38 b += array[number];39 else {40 b = array[number];41 begin = number;42 }43 if (b > sum) {//加个+44 sum = b;45 bestmin = begin;46 bestmax = number;47 }4849 }50 num1 = bestmin;51 num2= bestmax;52 setSum(sum);53 setY1(i);54 setY2(j);55 return sum;56 // if (sum==0)和为0的⾏数组要去掉那⼀⾏5758 }5960 }(3)TestmMaxList4 public static int[][] list=new int[10][10];5 public static void main(String[] arg){6 maxList maxlist=new maxList();7 maxlist.InputList(list);8 maxlist.subMaxList(list);9 maxlist.OutputMaxSumList(list); 1011 }12}四、 实验结果(含程序运⾏截图)五、 出现问题及解决⽅法(⼀)出现的问题在于算法的设计上,⼀开始我认为最⼤⼦矩阵就是每⾏所构成的最⼤⼦段的⾏列的序号交集,后来发现不是这样的,这样没办法正确输出最⼤⼦矩阵,得到的结果不对,然后推翻⾃⼰写了⼀天的代码以及想法。

离散型动态规划问题(举例)

离散型动态规划问题(举例)

表1 利润增长额 gi (x j ) (百元)
投资额
(j) 0 100 200 300 400 500 600
工厂(i)
2
0 25 45 57 65 70 73
f2 (600) max{g2 (0) f3(600), g2 (100) f3(500), g2 (200) f3(400), g2 (300) f3(300), g2 (400) f3(200), g2 (500) f3(100) g2 (600) f3(0)}
工厂(i)
4
0 28 47 65 74 80 85
自然问:现在还有多少钱?即 s4 =? s4 =0,100,200,300,400,500,600都有可能。 下面分情况讨论:
s4 0
表1 利润增长额 gi (x j ) (百元)
投资额
(j) 0 100 200 300 400 500 600
工厂2
状态 s3
投资x3
工厂3
投资x4
状态 s4 工厂4 s5
g1 (x1 )
s2 s1 x1 g 2 (x2 ) s3 s2 x2
s4 s3 x3 g3 (x3 )
g4 (x4 )
状态变量 sk :可用于第k, k+1,…n个工厂的投资额。
决策变量 xk :第 k 阶段对第 k 个工厂的投资额。 允许决策集 Dk : Dk {0, 100, , sk }
投资额
(j) 0 100 200 300 400 500 600
工厂(i)
4
0 28 47 65 74 80 85
f4 (s4 )

max {g
0x4 s4

动态规划求解01背包问题

动态规划求解01背包问题

动态规划求解01背包问题问题给定n种物品和⼀个背包,物品(1<=i<=n)重量是w I ,其价值v i,背包容量为C,对每种物品只有两种选择:装⼊背包和不装⼊背包,即物品是不可能部分装⼊,部分不装⼊。

如何选择装⼊背包的物品,使其价值最⼤?想法该问题是最优化问题,求解此问题⼀般采⽤动态规划(dynamic plan),很容易证明该问题满⾜最优性原理。

动态规划的求解过程分三部分:⼀:划分⼦问题:将原问题划分为若⼲个⼦问题,每个⼦问题对应⼀个决策阶段,并且⼦问题之间具有重叠关系⼆:确定动态规划函数:根据⼦问题之间的重叠关系找到⼦问题满⾜递推关系式(即动态规划函数),这是动态规划的关键三:填写表格:设计表格,以⾃底向上的⽅式计算各个⼦问题的解并填表,实现动态规划过程。

思路:如何定义⼦问题?0/1背包可以看做是决策⼀个序列(x1,x2,x3,…,xn),对任何⼀个变量xi的决策时xi=1还是xi=0. 设V(n,C)是将n个物品装⼊容量为C的背包时背包所获得的的最⼤价值,显然初始⼦问题是将前i个物品装如容量为0的背包中和把0个物品装⼊容量为j的背包中,这些情况背包价值为0即V(i,0)=V(0,j)=0 0<=i<=n, 0<=j<=C接下来考虑原问题的⼀部分,设V(I,j)表⽰将前i个物品装⼊容量为j的背包获得的最⼤价值,在决策xi时,已经确定了(x1,x2,…,xi-1),则问题处于下列两种情况之⼀:1. 背包容量不⾜以装⼊物品i,则装⼊前i-1个物品的最⼤价值和装⼊前i个物品最⼤价值相同,即xi=0,背包价值没有增加2. 背包容量⾜以装⼊物品i,如果把物品i装⼊背包,则背包物品价值等于把前i-1个物品装⼊容量为j-wi的背包中的价值加上第i个物品的价值vi;如果第i个物品没有装⼊背包,则背包价值等于把前i-1个物品装⼊容量为j的背包中所取得的价值,显然,取⼆者最⼤价值作为把物品i装⼊容量为j的背包中的最优解,得到如下递推公式为了确定装⼊背包中的具体物品,从V(n,C)的值向前推,如果V(n,C)>V(n-1,C),则表明第n个物品被装⼊背包中,前n-1个物品被装⼊容量为C-wn的背包中;否则,第n个物品没有被装⼊背包中,前n-1个物品被装⼊容量为C的背包中,依次类推,直到确认第⼀个物品是否被装⼊背包中代码C++实现1. // dp_01Knapsack.cpp : 定义控制台应⽤程序的⼊⼝点。

noi练习题

noi练习题

NOI练习题一、基础算法1.1 递归算法1. 请编写一个C++函数,实现求斐波那契数列的第n项。

2. 编写一个C++函数,实现计算阶乘n!。

1.2 循环算法3. 编写一个C++程序,实现输出1到100之间所有偶数。

4. 编写一个C++程序,计算1到100之间所有奇数的和。

1.3 排序算法5. 编写一个C++程序,使用冒泡排序算法对数组进行从小到大排序。

6. 编写一个C++程序,使用快速排序算法对数组进行从小到大排序。

二、数据结构2.1 线性表7. 编写一个C++程序,实现单链表的创建、插入、删除和查找操作。

8. 编写一个C++程序,实现顺序表的创建、插入、删除和查找操作。

2.2 栈和队列9. 编写一个C++程序,实现栈的基本操作:入栈、出栈、查看栈顶元素。

10. 编写一个C++程序,实现队列的基本操作:入队、出队、查看队首元素。

2.3 树和图11. 编写一个C++程序,实现二叉树的创建、遍历(前序、中序、后序)。

12. 编写一个C++程序,实现图的邻接矩阵表示和邻接表表示。

三、数学问题3.1 素数问题13. 编写一个C++程序,判断一个整数是否为素数。

14. 编写一个C++程序,输出1到100之间的所有素数。

3.2 最大公约数和最小公倍数15. 编写一个C++程序,计算两个整数的最大公约数。

16. 编写一个C++程序,计算两个整数的最小公倍数。

四、搜索算法4.1 暴力搜索17. 编写一个C++程序,实现全排列算法。

18. 编写一个C++程序,实现组合算法。

4.2 深度优先搜索19. 编写一个C++程序,使用深度优先搜索解决迷宫问题。

20. 编写一个C++程序,使用深度优先搜索求解N皇后问题。

五、动态规划5.1 斐波那契数列21. 编写一个C++程序,使用动态规划求解斐波那契数列的第n项。

5.2 最长公共子序列22. 编写一个C++程序,使用动态规划求解两个字符串的最长公共子序列。

5.3 最小路径和23. 编写一个C++程序,使用动态规划求解二维数组中的最小路径和。

运筹学》习题答案运筹学答案

运筹学》习题答案运筹学答案

《运筹学》习题答案一、单选题1.用动态规划求解工程线路问题时,什么样的网络问题可以转化为定步数问题求解( )BA.任意网络B.无回路有向网络C.混合网络D.容量网络2.通过什么方法或者技巧可以把工程线路问题转化为动态规划问题?( )BA.非线性问题的线性化技巧B.静态问题的动态处理C.引入虚拟产地或者销地D.引入人工变量3.静态问题的动态处理最常用的方法是?BA.非线性问题的线性化技巧B.人为的引入时段C.引入虚拟产地或者销地D.网络建模4.串联系统可靠性问题动态规划模型的特点是( )DA.状态变量的选取B.决策变量的选取C.有虚拟产地或者销地D.目标函数取乘积形式5.在网络计划技术中,进行时间与成本优化时,一般地说,随着施工周期的缩短,直接费用是( )。

CA.降低的B.不增不减的 C .增加的 D .难以估计的6.最小枝权树算法是从已接接点出发,把( )的接点连接上CA.最远B.较远C.最近D.较近7.在箭线式网络固中,( )的说法是错误的。

DA.结点不占用时间也不消耗资源B.结点表示前接活动的完成和后续活动的开始C.箭线代表活动D.结点的最早出现时间和最迟出现时间是同一个时间8.如图所示,在锅炉房与各车间之间铺设暖气管最小的管道总长度是( )。

CA.1200B.1400C.1300D.17009.在求最短路线问题中,已知起点到A ,B ,C 三相邻结点的距离分别为15km ,20km,25km ,则( )。

DA.最短路线—定通过A 点B.最短路线一定通过B 点C.最短路线一定通过C 点D.不能判断最短路线通过哪一点10.在一棵树中,如果在某两点间加上条边,则图一定( )AA.存在一个圈B.存在两个圈 C .存在三个圈 D .不含圈11.网络图关键线路的长度( )工程完工期。

C A.大于 B.小于 C.等于D.不一定等于 600 700300 500 400锅炉房12312.在计算最大流量时,我们选中的每一条路线( )。

0018算法笔记——【动态规划】流水作业调度问题与Johnson法则

0018算法笔记——【动态规划】流水作业调度问题与Johnson法则

0018算法笔记——【动态规划】流水作业调度问题与Johnson法则D记S=N-{π(1)},则有T’=T(S,bπ(1))。

证明:事实上,由T的定义知T’>=T(S,bπ(1))。

若T’>T(S,bπ(1)),设π’是作业集S在机器M2的等待时间为bπ(1)情况下的一个最优调度。

则π(1),π'(2),…,π'(n)是N的一个调度,且该调度所需的时间为aπ(1)+T(S,bπ(1))<aπ(1)+T’。

这与π是N的最优调度矛盾。

故T’<=T(S,bπ(1))。

从而T’=T(S,bπ(1))。

这就证明了流水作业调度问题具有最优子结构的性质。

由流水作业调度问题的最优子结构性质可知:从公式(1)可以看出,该问题类似一个排列问题,求N个作业的最优调度问题,利用其子结构性质,对集合中的每一个作业进行试调度,在所有的试调度中,取其中加工时间最短的作业做为选择方案。

将问题规模缩小。

公式(2)说明一般情况下,对作业集S进行调度,在M2机器上的等待时间,除了需要等该部件在M1机器上完成时间,还要冲抵一部分原来的等待时间,如果冲抵已成负值,自然仍需等待M1将作业做完,所以公式取max{t-ai,0}。

3、动态规划法求解思路假设有一组作业需要在M1和M2 两台机器上进行流水作业,他们在M1和M2上的作业时间如下表:问题是如何安排他们的加工顺序,使得,到最后一个作业在机器M2上加工完成所需要的时间最少。

也就是所有作业在两台机器全部加工完成所需的时间最少。

思路如下:考虑如果只有一个作业的情况,肯定所需时间就是它自身需要在M1和M2 上的加工时间总和;如果有两个作业就要考虑在两种不同的加工顺序下选取最优的一种作为候选,三个作业的时会出现三种组合情况(0,(1,2)); (1,(0,2)); (2,(0,1)),拿第一种为例,它表示先加工作业0,然后再按照作业1和作业2的优化顺序加工;将三种的作业时间计算出来,取最小值,即为三个作业的优化结果,同理可对更多的作业进行排序优化。

算法复习题目及答案讲解

算法复习题目及答案讲解

一、选择题1、二分搜索算法是利用( A )实现的算法。

A、分治策略B、动态规划法C、贪心法D、回溯法2、下列不是动态规划算法基本步骤的是( A )。

A、找出最优解的性质B、构造最优解C、算出最优解D、定义最优解3、最大效益优先是( A )的一搜索方式。

A、分支界限法B、动态规划法C、贪心法D、回溯法4、在下列算法中有时找不到问题解的是( B )。

A、蒙特卡罗算法B、拉斯维加斯算法C、舍伍德算法D、数值概率算法5. 回溯法解旅行售货员问题时的解空间树是( A )。

A、子集树B、排列树C、深度优先生成树D、广度优先生成树6.下列算法中通常以自底向上的方式求解最优解的是( B )。

A、备忘录法B、动态规划法C、贪心法D、回溯法7、衡量一个算法好坏的标准是( C )。

A 运行速度快B 占用空间少C 时间复杂度低D 代码短8、以下不可以使用分治法求解的是( D )。

A 棋盘覆盖问题B 选择问题C 归并排序D 0/1背包问题9. 实现循环赛日程表利用的算法是( A )。

A、分治策略B、动态规划法C、贪心法D、回溯法10、下列随机算法中运行时有时候成功有时候失败的是( C )A 数值概率算法B 舍伍德算法C 拉斯维加斯算法D 蒙特卡罗算法11.下面不是分支界限法搜索方式的是( D )。

A、广度优先B、最小耗费优先C、最大效益优先D、深度优先12.下列算法中通常以深度优先方式系统搜索问题解的是( D )。

A、备忘录法B、动态规划法C、贪心法D、回溯法13.备忘录方法是那种算法的变形。

( B )A、分治法B、动态规划法C、贪心法D、回溯法14.哈弗曼编码的贪心算法所需的计算时间为( B )。

A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)15.分支限界法解最大团问题时,活结点表的组织形式是( B )。

A、最小堆B、最大堆C、栈D、数组16.最长公共子序列算法利用的算法是( B )。

A、分支界限法B、动态规划法C、贪心法D、回溯法17.实现棋盘覆盖算法利用的算法是( A )。

动态规划

动态规划



状态 B1 在决策 u2 ( B1 ) 作用下的一个新的状态,记作u2 ( B1 ) C2 . 4、策略 策略是一个按顺序排列的决策组成的集合。由过程的第 k 阶段开始到 终止状态为止的过程,称为问题的后部子过程(或称为 k 子过程)。
返回 结束
动态规划
由每段的决策按照顺序排列组成的决策函数序列
k 1,2,, n.
对于动态规划模型的指标函数,应具有可分离性,并满足递推关系
Vk ,n k [ sk , uk ,Vk 1,n ( sk 1 ,, sn1 )]
在实际问题中指标函数都满足这个性质。 常见的指标函数有下列两种形式 (1)过程和任一子过程的指标是它所包含的各阶段指标的和,即
指标函数的最优值,称为最优值函数,记作 f k (sk ) 它表示从第 k 阶段 的状态 sk 开始到第 n 阶段的终止状态的过程,采取最优策略所得到的 指标函数值。即
f k ( sk ) opt Vk ,n ( sk , uk ,, sn1 )
uk ,,un
返回 结束
动态规划
在不同的问题中,指标函数的含义不同,它可能是距离,利润,成本 ,产品的产量,资源消耗等。 二、动态规划的基本思想和基本方程 结合最短路问题介绍动态规划的基本思想 。最短路线有一个重要特性,
这种递推关系式称为动态规划的基本方程。
返回
结束
动态规划
资源分配问题 某工业部门根据国家计划的安排,将某种高效率的设备 五台,分配给所属的甲、乙、丙三个工厂,各工厂若获得 这种设备之后,可以为国家提供盈利如表2-2所示。
问这五台设备应如何分配给工厂,才能使国家得到的 盈利最大。
返回
结束
动态规划
表2-2

(完整word版)运筹学习题及答案

(完整word版)运筹学习题及答案
A.无可行解 B。有唯一最优解 C。有多重最优解 D。有无界解
34。某个常数bi波动时,最优表中引起变化的有(A)
A.B-1bB。 C.B-1D.B-1N
35.某个常数bi波动时,最优表中引起变化的有(C)
A. 检验数 B。CBB-1C。CBB-1b D。系数矩阵
36.任意一个容量的网络中,从起点到终点的最大流的流量等于分离起点和终点的任一割集的容量.(B)A.正确B。错误C.不一定D。无法判断
9.对偶单纯形法迭代中的主元素一定是负元素( )A
A。正确B.错误C。不一定D。无法判断
10。对偶单纯形法求解极大化线性规划时,如果不按照最小化比值的方法选取什么变量则在下一个解中至少有一个变量为正( )B
A。换出变量B.换入变量C.非基变量D。基变量
11.对 问题的标准型: ,利用单纯形表求解时,每做一次换基迭代,都能保证它相应的目标函数值 必为()B
A.换出变量B.换入变量C。非基变量D。基变量
29。可行解是满足约束条件和非负条件的决策变量的一组取值.( )A
A。正确B。错误C。不一定D。无法判断
30。 连通图G有n个点,其部分树是T,则有(C)
A。T有n个点n条边 B.T的长度等于G的每条边的长度之和
C.T有n个点n-1条边 D。T有n-1个点n条边
47.通过什么方法或者技巧可以把产销不平衡运输问题转化为产销平衡运输问题(C)
A。非线性问题的线性化技巧B.静态问题的动态处理
C.引入虚拟产地或者销地D。引入人工变量
48.为什么单纯形法迭代的每一个解都是可行解?因为遵循了下列规则 (A)
A。按最小比值规则选择出基变量 B。先进基后出基规则
C。标准型要求变量非负规则 D。按检验数最大的变量进基规则
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态规划练习【题目一览】总分【问题描述】学生在我们USACO的竞赛中的得分越多我们越高兴。

我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助。

我们可以从几个种类中选取竞赛的题目,这里的一个“种类”是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。

你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大。

输入包括竞赛的时间M(1<=M<=10000)(不要担心,你要到了训练营中才会有长时间的比赛)和“种类”的数目N(1<=N<=10000)。

后面的每一行将包括两个整数来描述一个“种类”:第一个整数说明解决这种题目能得的分数(1<=points<=10000),第二整数说明解决这种题目所需的时间(1<=minutes<=10000)。

你的程序应该确定我们应该从每个“种类”中选多少道题目使得能在竞赛的时间中得到最大的分数。

来自任意的“种类”的题目数目可能任何非负数(0或更多)。

计算可能得到的最大分数。

【输入格式】输入文件中的第1行:M,N--竞赛的时间和题目“种类”的数目。

第2~N+1行:两个整数:每个“种类”题目的分数和耗时。

【输出格式】输出文件中仅一行,包括那个在给定的限制里可能得到的最大的分数。

【输入输出样例】输入:300 4100 60250 120120 10035 20输出:605从第2个“种类”中选两题第4个“种类”中选三题。

邮票【问题描述】已知一个N枚邮票的面值集合(如,{1分,3分})和一个上限K——表示信封上能够贴K张邮票。

计算从1到M的最大连续可贴出的邮资。

例如,假设有1分和3分的邮票;你最多可以贴5张邮票。

很容易贴出1到5分的邮资(用1分邮票贴就行了),接下来的邮资也不难:6 = 3 + 37 = 3 + 3 + 18 = 3 + 3 + 1 + 19 = 3 + 3 + 310 = 3 + 3 + 3 + 111 = 3 + 3 + 3 + 1 + 112 = 3 + 3 + 3 + 313 = 3 + 3 + 3 + 3 + 1然而,使用5枚1分或者3分的邮票根本不可能贴出14分的邮资。

因此,对于这两种邮票的集合和上限K=5,答案是M=13。

【输入格式】输入文件中的第一行:两个整数K和N(1<=K<=200,1<=N<=50)。

K是可用的邮票总数,N是邮票面值的数量。

第二行..文件末:N个整数,每行15个,列出所有的N个邮票的面值,面值不超过10000。

【输出格式】输出文件中的第一行:一个整数,从1分开始连续的可用集合中不多于K张邮票贴出的邮资数。

【输入输出样例】输入:5 21 3输出:13家的范围【问题描述】农民约翰在一片边长是N(2<=N<=250)英里的正方形牧场上放牧他的奶牛(因为一些原因,他的奶牛只在正方形的牧场上吃草)。

遗憾的是,他的奶牛已经毁坏一些土地。

(一些1平方英里的正方形)农民约翰需要统计那些可以放牧奶牛的正方形牧场(至少是2×2的,在这些较大的正方形中没有小于1×1的部分被分割毁坏)。

你的工作要在被供应的数据组里面统计所有不同的正方形放牧区域(>2×2)的个数。

当然,放牧区域可能是重叠。

【输入格式】输入文件中的第1行:N,牧区的边长。

第2到n+1行:N个没有空格分开的字符。

0表示“那一个区段被毁坏了”,1表示“准备好被吃”。

【输出格式】输出那些存在的正方形的大小和个数,一种一行。

【输入输出样例】输入:6101111001111111111001111101101111001输出:2 103 44 1游戏【问题描述】有如下一个双人游戏:N(2<=N<=100)个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。

以最终得分多者为胜。

编写一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。

你的程序要始终为第二位玩家执行最优策略。

【输入格式】输入文件中的第一行:正整数N,表示序列中正整数的个数。

第二行至末尾:用空格分隔的N个正整数(大小为1~200)。

【输出格式】输出文件中只有一行,用空格分隔的两个整数:依次为玩家一和玩家二最终的得分。

【输入输出样例】输入:64 7 2 95 2输出:18 11商店购物【问题描述】在商店中,每一种商品都有一个价格(用整数表示)。

例如,一朵花的价格是2 zorkmids(z),而一个花瓶的价格是5z。

为了吸引更多的顾客,商店举行了促销活动。

促销活动把一个或多个商品组合起来降价销售,例如:三朵花的价格是5z而不是6z,两个花瓶和一朵花的价格是10z而不是12z。

编写一个程序,计算顾客购买一定商品的花费,尽量利用优惠使花费最少。

尽管有时候添加其他商品可以获得更少的花费,但是你不能这么做。

对于上面的商品信息,购买三朵花和两个花瓶的最少花费是:以优惠价购买两个花瓶和一朵花(10z),以原价购买两朵花(4z)。

【输入格式】输入文件中包括一些商店提供的优惠信息,接着是购物清单。

第一行:优惠商品的种类数s(0<=s<=99)。

第二行..第s+1行:每一行都用几个整数来表示一种优惠方式。

第一个整数n(1<=n<=5),表示这种优惠方式由n种商品组成。

后面n对整数c和k(1<=k<=5,1<=c<=999),表示k个编号为c的商品共同构成这种优惠,最后的整数p(1<=p<=9999)表示这种优惠的优惠价。

优惠价总是比原价低。

第s+2行:这一行有一个整数b(0<=b<=5),表示需要购买b种不同的商品。

第s+3行..第s+b+2行:这b行中的每一行包括三个整数:c,k和p(1<=c<=999,1<=k<=5,1<=p<=999)。

c表示唯一的商品编号,k表示需要购买的c商品的数量。

p表示c商品的原价。

最多购买5×5=25个商品。

【输出格式】输出文件中只有一行,输出一个整数:购买这些物品的最低价格。

【输入输出样例】输入:21 7 3 52 7 1 8 2 1027 3 28 2 5输出:14“破锣摇滚”乐队【问题描述】你刚刚继承了流行的“破锣摇滚”乐队录制的尚未发表的N首歌的版权。

你打算从中精选一些歌曲,发行M张CD。

每一张CD最多可以容纳T分钟的音乐,一首歌不能分装在两张CD中。

不巧你是一位古典音乐迷,不懂如何判定这些歌的艺术价值。

于是你决定根据以下标准进行选择:歌曲必须按照创作的时间顺序在CD盘上出现。

选中的歌曲数目尽可能地多。

【输入格式】输入文件中的第一行:三个整数:N,T,M(1<=N<=20,1<=M<=20,1<=T<=20)。

第二行:N个整数,分别表示每首歌的长度,按创作时间顺序排列。

【输出格式】一个整数,表示可以装进M张CD盘的乐曲的最大数目。

【输入输出样例】输入:4 5 24 3 4 2输出:3麦香牛块【问题描述】农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块。

奶牛们正在想尽一切办法让这种可怕的设想泡汤。

奶牛们进行斗争的策略之一是“劣质的包装”。

“看”,奶牛们说,“如果你用只有一次能装3块、6块或10块的三种包装盒装麦香牛块,你就不可能满足想要一次只想买1、2、4、5、7、8、11、14或17块麦香牛块的顾客了。

劣质的包装意味着劣质的产品。

”你的任务是帮助这些奶牛。

给出包装盒的种类数N(1<=N<=10)和N个代表不同种类包装盒容纳麦香牛块个数的正整数i(1<=i<=256),输出顾客不能用上述包装盒(每种盒子数量无限)买到麦香牛块的最大块数。

如果在限定范围内所有购买方案都能得到满足,则输出0。

范围限制是所有不超过2000000000的正整数。

【输入格式】输入文件中的第1行:包装盒的种类数N。

第2行到N+1行:每个种类包装盒容纳麦香牛块的个数。

【输出格式】输出文件中只有一行数字:顾客不能用包装盒买到麦香牛块的最大块数或0(如果在限定范围内所有购买方案都能得到满足)。

【输入输出样例】输入:33610输出:17最长前缀【问题描述】在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。

生物学家对于把长的序列分解成较短的(称之为元素的)序列很感兴趣。

如果一个集合 P 中的元素可以通过串联(允许重复;串联,相当于Pascal中的“+”运算符)组成一个序列S,那么我们认为序列S可以分解为P中的元素。

并不是所有的元素都必须出现。

举个例子,序列ABABACABAAB可以分解为下面集合中的元素:{A,AB,BA,CA,BBC}序列S的前面K个字符称作S中长度为K的前缀。

设计一个程序,输入一个元素集合以及一个大写字母序列,计算这个序列最长的前缀的长度。

【输入格式】输入文件中的开头包括1..200个元素(长度为1..10)组成的集合,用连续的以空格分开的字符串表示。

字母全部是大写,数据可能不止一行。

元素集合结束的标志是一个只包含一个“.”的行。

集合中的元素没有重复。

接着是大写字母序列S,长度为1..200000,用一行或者多行的字符串来表示,每行不超过76个字符。

换行符并不是序列S的一部分。

【输出格式】输出文件中只有一行,输出一个整数,表示S能够分解成P中元素的最长前缀的长度。

【输入输出样例】输入:A AB BA CA BBC.ABABACABAABC输出:11货币系统【问题描述】母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。

[In their own rebellious way],他们对货币的数值感到好奇。

传统地,一个货币系统是由1,5,10,20或25,50和100的单位面值组成的。

母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值。

举例来说,使用一个货币系统{1,2,5,10,…}产生18单位面值的一些可能的方法是:18×1,9×2,8×2+2×1,3×5+2+1等等其它。

编写一个程序来计算有多少种方法用给定的货币系统来构造一定数量的面值。

保证总数将会适合long long(C/C++)和Int64(Free Pascal)。

【输入格式】货币系统中货币的种类数目是V(1<=V<=25)。

要构造的数量钱是N(1<=N<=10000)。

相关文档
最新文档