A、B、C三位渔夫出海打鱼,他们随船带了21只箩筐。当晚返航时,他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐是空的。
由于他们没有秤,只好通过目测认为7个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。
那么问题来了,如何在不将鱼倒出来的前提下,怎样将鱼和筐平分为三份?
下面直接上代码:
########################
if __name__ == '__main__':
print("分鱼的方案如下: ")
count = 0
a = [[0]*3 for i in range(3)]
for i in range(4): # 试第一个人满筐a[0][0]的值,满筐数不能>3
a[0][0] = i
j = i
while j <= 7 - i and j <= 3: # 试第二个人满筐a[1][0]的值,满筐数不能>3
a[1][0] = j
a[2][0] = 7 - j - a[0][0]
j += 1
if a[2][0] > 3:
continue # 第三个人满筐数不能>3
if a[2][0] < a[1][0]:
break # 要求后一个人分的满筐数大于等于前一个人,以排除重复情况
for k in range(1, 6, 2):# 试半筐a[0][1]的值,半筐数为奇数
a[0][1] = k
for m in range(1, 7 - k, 2): # 试半筐a[1][1]的值,半筐数为奇数
a[1][1] = m
a[2][1] = 7 - k - m
flag, n = True, 0 # 判断每个人分到的鱼是否为3.5筐,flag为满足题意的标记变量
while flag and n < 3:
if a[n][0] + a[n][1] < 7 and a[n][0] * 2 + a[n][1] == 7:
a[n][2] = 7 - a[n][0] - a[n][1] # 计算应得到的空筐数量
else:
flag = False # 不符合题意则置标记为0
n += 1
if flag:
count += 1
print('方案:', count, ' 满框数 半框数 空框数')
for n in range(3):
print('渔夫', chr(65 + n), ':', a[n][0], a[n][1],a[n][2])
########################
执行结果如下:
分鱼的方案如下:
方案: 1 满框数 半框数 空框数
渔夫 A : 1 5 1
渔夫 B : 3 1 3
渔夫 C : 3 1 3
方案: 2 满框数 半框数 空框数
渔夫 A : 2 3 2
渔夫 B : 2 3 2
渔夫 C : 3 1 3
________________END______________
网友评论