华为 OD 机试:中秋分月饼
题目描述
中秋节,公司分月饼,m 个员工,买了 n 个月饼,m ≤ n,每个员工至少分 1 个月饼,但可以分多个,单人分到最多月饼的个数是 Max1,单人分到第二多月饼个数是 Max2 ,但需要满足 M a x 1 − M a x 2 ≤ 3 ,单人分到第 n − 1 多月饼个数是 M a x ( n − 1 ),单人分到第n多月饼个数是 M a x ( n ),想要满足 M a x ( n − 1 ) – M a x ( n ) ≤ 3 ,问有多少种分月饼的方法?
输入描述
输入 m n ,表示 m 个员工,n个月饼,m ≤ n
输出描述
输出有多少种分法
示例一
输入
2 4
输出
2
说明
分法有 2 种:
4 = 1+3
4 = 2+2
注意:1+3 和 3+1 算一种分法
示例二
输入
3 5
输出
2
python code
def allocate_mooncake(rem_people, rem_mooncake, min_m, mooncake_list):
if rem_mooncake < 0 or rem_people <= 0:
return 0
if rem_people == 1:
if min_m <= rem_mooncake <= min_m + 3:
# print(mooncake_list+[rem_mooncake])
return 1
return 0
count = 0
for got in range(min_m, min_m + 4):
count += allocate_mooncake(rem_people - 1, rem_mooncake - got, got, mooncake_list + [got])
return count
m, n = 3, 15
n -= m
while n > 3 * (m ** 2 - m) / 2:
n -= m
# print(n)
total_count = 0
for got in range(4):
total_count += allocate_mooncake(m - 1, n - got, got, [got])
print(total_count)