一、 某公司招聘学生假期实习,并按日结算报酬。因每日工作内容和强度不同,每日实习的日薪不相同。另外,为了保证学生有时间充分休息,公司提出休息要求:学生实习一天后至少休息一天(即学生不能连续两天或连续两天以上去公司实习)。
(a) 请说明以下问题满足最优子结构属性和重叠子问题特性。
问题:在满足公司休息要求的条件下,一个学生在假期内最多能从该公司赚取多少总薪酬?
(b) 若假期长度为8 天,各天的日薪如下:
假
期
第
i
天
1
2
3
4
5
6
7
8
日
薪
s
[
i
]
(
单
位
:
元
)
150
180
80
100
140
80
180
200
\begin{array}{|c| c c c c c c c c|} \hline 假期第i 天 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 \\ \hline 日薪s[i](单位:元) & 150 & 180 & 80 & 100 & 140 & 80 & 180 & 200 \\ \hline \end{array}
假期第i天日薪s[i](单位:元)115021803804100514068071808200
在满足公司休息要求的条件下,一个学生应在哪几天去该公司实习才能获得最多总薪酬呢?最多总薪酬是多少?要求写出分析过程。
解:
(1)
最优子结构
反证法:假设该问题不满足最优子结构属性。
- 假设前 8 8 8 天内的最高总薪酬为 y y y 元,工作的天数为 i ⃗ = { i 1 , i 2 … 8 } \vec{i}= \{i_1,i_2…8\} i={i1,i2…8} (包含第 8 8 8 天),此时,第 7 7 7 天不能工作,假设前 6 6 6 天内的最高总薪酬为 x x x 元,工作的天数为 i ′ ⃗ = { i 1 , i 2 … } \vec{i'}=\{i_1,i_2…\} i′={i1,i2…} ,不满足最优子结构,即 y − 200 < x y-200<x y−200<x 。此时,当到第 8 8 8 天时,最大薪酬 y = ( x + 200 ) y=(x+200) y=(x+200) 元,与假设不符。
- 假设前 8 8 8 天内的最高总薪酬为 y ′ y' y′ 元,工作的天数为 { i 1 , i 2 … } \{i_1,i_2…\} {i1,i2…} (不包含第 8 8 8 天),而前 7 7 7 天内的最高总薪酬为 x ’ x’ x’ 元,工作的天数为 { i 1 , i 3 … } \{i_1,i_3…\} {i1,i3…} ,不满足最优子结构,即 y ′ < x ′ y'<x' y′<x′ 。但由于两种假设均不包含第 8 8 8 天,且二者均为最高薪酬,所以有 y ′ = x ′ y'=x' y′=x′ ,与假设不符。
综上,该问题满足最优子结构属性。
重叠子问题
如果采用递归方法计算,
前 8 8 8 天的最高薪酬需要先计算前 7 7 7 天、前 6 6 6 天、前 5 5 5 天……
而在计算前 7 7 7 天的最高薪酬时,又要重复计算前 5 5 5 天、前 4 4 4 天……
由此产生了重叠子问题。
故动态规划的递归公式为:
s
u
m
(
i
)
=
{
150
i
=
1
180
i
=
2
max
{
s
u
m
(
i
−
1
)
,
s
u
m
(
i
−
2
)
+
s
[
i
]
}
i
>
2
sum(i)=\begin{cases} 150 &i=1\\ 180 &i=2\\ \max\{sum(i-1),sum(i-2)+s[i]\} &i>2 \end{cases}
sum(i)=⎩⎪⎨⎪⎧150180max{sum(i−1),sum(i−2)+s[i]}i=1i=2i>2
(2)
假设前 i i i 天的最高总薪酬为 s u m [ i ] sum[i] sum[i] ,工作的天数为 d a y day day :
则
s u m [ 1 ] = 150 sum[1]=150 sum[1]=150 , d a y = [ 1 ] day=[1] day=[1] ;
s u m [ 2 ] = max { s u m [ 1 ] , s [ 2 ] } = max { 150 , 180 } = 180 sum[2]=\max\{sum[1],s[2]\}=\max\{150,180\}=180 sum[2]=max{sum[1],s[2]}=max{150,180}=180 , d a y = [ 2 ] day=[2] day=[2] ;
s u m [ 3 ] = max { s u m [ 1 ] + s [ 3 ] , s u m [ 2 ] } = max { 230 , 180 } = 230 sum[3]=\max\{sum[1]+s[3],sum[2]\}=\max\{230,180\}=230 sum[3]=max{sum[1]+s[3],sum[2]}=max{230,180}=230 , d a y = [ 1 , 3 ] day=[1,3] day=[1,3] ;
s u m [ 4 ] = max { s u m [ 3 ] , s u m [ 2 ] + s [ 4 ] } = max { 230 , 280 } = 280 sum[4]=\max\{sum[3],sum[2]+s[4]\}=\max\{230,280\}=280 sum[4]=max{sum[3],sum[2]+s[4]}=max{230,280}=280 , d a y = [ 2 , 4 ] day=[2,4] day=[2,4] ;
s u m [ 5 ] = max { s u m [ 3 ] + s [ 5 ] , s u m [ 4 ] } = max { 370 , 280 } = 370 sum[5]=\max\{sum[3]+s[5],sum[4]\}=\max\{370,280\}=370 sum[5]=max{sum[3]+s[5],sum[4]}=max{370,280}=370 , d a y = [ 1 , 3 , 5 ] day=[1,3,5] day=[1,3,5] ;
s u m [ 6 ] = max { s u m [ 5 ] , s u m [ 4 ] + s [ 6 ] } = max { 370 , 360 } = 370 sum[6]=\max\{sum[5],sum[4]+s[6]\}=\max\{370,360\}=370 sum[6]=max{sum[5],sum[4]+s[6]}=max{370,360}=370 , d a y = [ 1 , 3 , 5 ] day=[1,3,5] day=[1,3,5] ;
s u m [ 7 ] = max { s u m [ 5 ] + s [ 7 ] , s u m [ 6 ] } = max { 550 , 370 } = 550 sum[7]=\max\{sum[5]+s[7],sum[6]\}=\max\{550,370\}=550 sum[7]=max{sum[5]+s[7],sum[6]}=max{550,370}=550 , d a y = [ 1 , 3 , 5 , 7 ] day=[1,3,5,7] day=[1,3,5,7] ;
s u m [ 8 ] = max { s u m [ 7 ] , s u m [ 6 ] + s [ 8 ] } = max { 550 , 570 } = 570 sum[8]=\max\{sum[7],sum[6]+s[8]\}=\max\{550,570\}=570 sum[8]=max{sum[7],sum[6]+s[8]}=max{550,570}=570 , d a y = [ 1 , 3 , 5 , 8 ] day=[1,3,5,8] day=[1,3,5,8] ;
故该学生应在第1、3、5、8天去实习,假期总薪酬为 570 570 570 元。