[求助]阿里笔试放鱼丸肉丸问题

鱼丸N个,肉丸M个,碗K个,每个碗可以装无限个丸子,鱼丸和肉丸必须放在不同的碗里,不考虑碗的顺序,问总共多少种放法。。。
有没有小伙伴知道这题怎么做呀。
#阿里巴巴##笔试题目##春招#
全部评论
哎,当时脑子没转过来,没实现那个递归函数,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
点赞 回复 分享
发布于 2019-04-12 23:11
求解求解。。阿里的题可真难
点赞 回复 分享
发布于 2019-04-12 20:52
四个情况吧
点赞 回复 分享
发布于 2019-04-12 20:50

相关推荐

点赞 评论 收藏
分享
05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务