m个人分n种水果,不同种水果的个数用fruit表示,每一个人不同拥有同种水果,求所有人分到水果的个数最大值。
【双循环:对水果种类、各个人数】(只要水果种类没有分完就对每一个人遍历)
【循环中双判断:是否得到过当前水果,当前水果是否分配完、下种水果是否存在】
是否分配给同一个相同的水果,当前水果数是否分完
# m个人平均瓜分n种水果, fruit表示n种水果个数不同,person表示不同人得到的各自水果标记
# 三人分三种水果
n = 3
m = 3
fruit = [2,3,4]
# 5人分2种水果
n = 2
m = 5
fruit = [2,4]
# 3人分4种水果
n = 4
m = 3
fruit = [6,7,2,1]
person = [ [] for i in range(m)]
fruiti = 0
j = 'fruit' + str(fruiti)
j_num = 0
# 只要水果种类没有分完,就对每个person赋予水果
while fruiti < n:
for i in range(m):
# personi没有得到过待分水果j,且fruiti索引的这种水果j没有分完
if j not in person[i]:
if j_num < fruit[fruiti]:
person[i].append(j)
j_num += 1
elif j_num >= fruit[fruiti]: # j分完了则用下一种索引为fruiti的水果
fruiti += 1
if fruiti < len(fruit): #当然下一种需要存在,否则结束程序
j = 'fruit' + str(fruiti)
person[i].append(j)
j_num = 1
else:
break
# personi没有得到过待分水果j
else:
fruiti += 1
if fruiti < len(fruit): # 下一种索引为fruiti的水果存在解急需,否则结束程序
j = 'fruit' + str(fruiti)
person[i].append(j)
j_num = 1
else:
break
max0 = len(person[0])
for i in person:
max0 = min(max0, len(i)) # 水果超出的部分无效
print(max0)