全部评论
哎,当时脑子没转过来,没实现那个递归函数,0.4打发了,以下是之后敲出来的,也不知道对不对,帮忙看看😪
import sys
def count_comb(X,Y,m): # X个球分为Y堆,每堆至少m个的组合数量
if X==0 or Y==0 or X<Y*m: # 球/堆为0 或 球不够每堆至少m个
return 0
if Y==1: # 只分一堆的话,只有一种组合可能
return 1
sm = 0
# 分为 1 和 Y-1 两部分,第一部分为i个球,第二部分为X-i个球
# 保证第二部分的每一堆的数量必须大于等于第一部分,否则可能重复
for i in range(m,X//Y+1): # 第一部分最少为m个,最多为X//Y个(再多就不能保证存在满足上述条件的解了)
sm += count_comb(X-i, Y-1, i) #对于每一个i,可能的排列数量由第二部分决定
return sm
while True:
try:
M,N,K = int(raw_input()),int(raw_input()),int(raw_input())
cnt = 0
for num_null in range(0, K-2+1): # 空碗可能0 ~ K-2个,剩下至少鱼碗和肉碗各1个
for num_fish in range(1, K-num_null-1+1): # 鱼碗可能1 ~ K-num_null-1 个,剩下至少1个肉碗
cnt_fish = count_comb(M, num_fish, 1) # M个球分为num_fish堆,每堆至少1个
cnt_meat = count_comb(N, K-num_null-num_fish, 1) # N个球分为K-num_null-num_fish堆,每堆至少1个的组合数量
cnt += cnt_fish*cnt_meat # 在此种碗分配方式下,丸子的组合方式的组合数量
sys.stdout.write(str(cnt%10000)+'\n')
except:break
求解求解。。阿里的题可真难
四个情况吧
相关推荐
点赞 评论 收藏
分享