这学期离散数学考前慌慌张张的在知乎上过了一遍球盒问题八大类型,想着要是多有几个帖子能把计算公式简明扼要的列一下就好了。现在考完了,知识正热乎,这就分享一下:
球同,盒同,不空
part(r, n)函数其实就是对于正整数r最多分成n份的方式。利用python可以很容易实现,code如下。
def case1(r, n):
def part_helper(m, k, p):
if m <= 0:
return []
if k == 1:
if m <= p:
return [[m]]
return []
temp = []
for i in range(min(p, m), 0, -1):
temp += [[i] + s for s in part_helper(m - i, k - 1, i)]
return temp
return len(part_helper(r, n, r))
2. 球同,盒同,可空
那我们先把每个盒子放上一个,再做按1中的情况处理就好啦!所以只需要part(r + n, n)就好啦。或者为这种情况我们力求输入(r, n)直接得到结果,那么我们就修改1中最后的return就好了。
def case2(r, n):
def part_helper(m, k, p):
if m <= 0:
return []
if k == 1: