5动态规划演算法习题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5动态规划演算法习题答案
1.最大子段和问题:给定整数序列,求该序列形如的子段和的最大值:
1)已知一个简单演算法如下:
int maxsum(int n,int a,int
}试分析该演算法的时间複杂性。
2) 试用分治演算法解最大子段和问题,并分析演算法的时间複杂性。
3)试说明最大子段和问题具有最优子结构性质,并设计一个动态规划演算法解最大子段和问题。
分析演算法的时间複杂度。
(提示:令)
解:1)分析按照第一章,列出步数统计表,计算可得 2)分治演算法:将所给的序列a[1:n]分为两段 a [1:n/2]、a[n/2+1:n],分别求出这两段的最大子段和,则a[1:n]的最大子段和有三种可能:
①a[1:n]的最大子段和与a[1:n/2]的最大子段和相同;
②a[1:n]的最大子段和与a[n/2+1:n]的最大子段和相同;
③a[1:n]的最大子段和为两部分的栏位和组成,即;
intmaxsubsum ( int *a, int left , int right)
int s2 =0;
int right_sum =0;
for ( int i = center +1; i sum)
sum = b;
j=i;
end}return sum;
}自行推导,答案:时间複杂度为o(n)。
2.动态规划演算法的时间複杂度为o(n)(双机排程问题)用两台处理机a和b处理个作业。
设第个作业交给机器a处理时所需要的时间是,若由机器b来处理,则所需要的时间是。
现在要求每个作业只能由一台机器处理,每台机器都不能同时处理两个作业。
设计一个动态规划演算法,使得这两台机器处理完这个作业的时间最短(从任何一台机器开工到最后一台机器停工的总的时间)。
以下面的例子说明你的演算法:
解:(思路一)在完成前k个作业时,设机器a工作了x 时间,则机器b此时最小的工作时间是x的一个函式。
设f[k][x]表示完成前k个作业时,机器b最小的工作时间,则
其中对应第k个作业由机器b来处理(完成k-1个作业时机器a工作时间仍是x,则b在k-1阶段用时为);而对应
第k个作业由机器a处理(完成k-1个作业,机器a工作时间是x-a[k],而b完成k阶段与完成k-1阶段用时相同为)。
则完成前k个作业所需的时间为
1)当处理第一个作业时,a[1]=2,b[1]=3;
机器a所花费时间的所有可能值範围:0 x a[0].
x<0时,设f[0][x]= ∞,则max(x, ∞)= ∞;
0x<2时,f[1][x]=3,则max(0,3)=3,
x2时, f[1][x]= 0,则max(2,0)=2;
2)处理第二个作业时:x的取值範围是:0 <= x <= (a[0] + a[1]),
当x<0时,记f[2][x] = ∞;以此类推下去
(思路二)假定个作业的集合为。
设为的子集,若安排中的作业在机器a上处理,其余作业在机器b上处理,此时所用时间为,
则双机处理作业问题相当于确定的子集,使得安排是最省时的。
即转化为求使得。
若记,则有如下递推关係:(思路三)
此问题等价于求(x1,……xn),使得它是下面的问题最优解。
min max xi=0或1,i=1~n
基于动态规划演算法的思想,对每个任务i,依次计算集合s(i)。
其中每个集合中元素都是一个3元组(f1,f2,x)。
这个3元组的每个分量定义为
f1:处理机a的完成时间
f2:处理机b的完成时间
x:任务分配变数。
当xi=1时表示将任务i分配给处理机a,当xi=0时表示分配给处理机b。
初始时,s(0)=
令f=按处理时间少的原则来分配任务的方案所需的完成时间。
例如,当(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2),(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)时,按处理时间少的原则分配任务的方案为(x1,x2,x3,x4,x5,x6)=(1,1,0,1,0,1)
因此,f=max=19。
然后,依次考虑任务i,i=1~n。
在分配任务i时,只有2种情形,xi=1或xi=0。
此时,令s(i)=u在做上述集合并集的计算时,遵循下面的原则:
①当(a,b,c),(d,e,f)s(i)且a=d,b<=e时,仅保留(a,b,c);
仅当max<=f时,(a,b,c)s(i)
最后在s(n)中找出使max达到最小的元素,相应的x即为所求的最优解,其最优值为max。
当(a1,a2,a3,a4,a5,a6)
=(2,5,7,10,5,2),(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)时, 按处理时间少的原则分配任务的方案为(x1,x2,x3,x4,x5,x6)=(1,1,0,1,0,1)
因此,f=max=19。
s(0)=;
s(1)=
s(2)=
s(3)=
s(4)=
s(5)=
s(6)=
max(f1,f2)最小的元组为(14,15,102), (14,15,82), (15,14,20)
所以,完成所有作业最短时间是15,安排有三种:
(1,1,0,0,1,1),(1,0,0,1,0,1),(0,1,0,1,0,0)
3.考虑下面特殊的整数线性规划问题
试设计一个解此问题的动态规划演算法,并分析演算法的时间複杂度。
解:方法1.
设令,则上述规划问题转化为:
,其中,
把看作价值,看作重量,看作揹包容量。
转化为0/1揹包问题,所以可以0/1揹包问题的动态规划演算法来求解。
由于n件物品的0/1揹包的时间複杂性是o(2n),则此时为o(4n)。
方法2.
可以看成是另一种揹包问题。
即b为揹包容量,为揹包中可以装0,1,或者2件物品,对应的价值为,求在容量b 一定的前提下,揹包所容纳的物品的最大价值。
也就是引数完全相同的两个0-1揹包问题,它们同时制约于揹包容量为c这个条件。
在设计演算法时可以优先考虑,也就是先判断揹包剩下的容量能不能放进去,若可以再判断能否使,若可以则就再放入一个,这样就间接满足了的条件。