1.问题:
红黑积木求和
有红黑两种颜色的积木,红色代表正数A,黑色代表负数B,选出17块积木排成一排,使得任意相邻7块积木之和都小于0,
如何选才能使17块积木之和最大,最大值是多少?
2.分析:
任意相邻的7个积木之和都小于零,假使这7个值(比如1至7)之和最大(虽然为负数),
为了使17块积木之和最大,我们可以设定任意相邻的7块积木之和最大且相等,故得出以下关系:
1,8,15位置为相等的数,2,9,16为相等的数,3,10,17位置数相同,...如下表所示:
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 |
设 在头7个位置中,正数A的数量为i,最好从左边(具有3个相同位置的数)开始选择,
负数的数量为(7-i)个,最好从右边开始选择。
if i>0 and i<=3:
max = 3*i*A + 2*4*B+3*(7-i-4)*B
if i>3:
max = 3*3*A+2*(i-3)*A+2*(7-i)*B
# A 为正数, B为负数
def A_num(A,B):
i = 7
for i in range(7,0,-1):
if A*i+(7-i)*B < 0: # i(0,7) 为 正数的个数,
break
max1 = 2 * (7-i) * B +(3+2*i)*A
return max1
print("A_num:",A_num(10,-61)) # A_num: 28