如何解决用于生成“垃圾箱中的球”结果并限制垃圾箱大小的算法?
假设我们有 N 个球和 M 个箱子可以放入它们。可以使用“星星和条形”方法 Integer Equations - Stars and Bars 找到此结果的数量。我们还可以使用 itertools
包计算所有实际结果,并使用 sympy.utilities.iterables.multiset_permutations
获得唯一结果。
如果我们将 bin 大小限制为 [0,N] 上的某个任意数字,您如何有效地计算所有可能的结果?有没有比在没有 bin 大小的情况下计算所有结果然后在之后消除无效结果更好的方法?
对于 N = 2 和 M = 3,结果为 {200,110,020,011,101,002}
。
例如,当 N = 3 且 M = 3 时,结果为 {300,210,120,021,012,030,201,102,003,111}
。但是,如果我们想要某个数组 b=[3,3,0]
指定最大 bin 大小,以便唯一有效的结果是 {300,030}
,该怎么办?
解决方法
您可以使用递归方法将 0 到最大的球放在第一个箱上,然后将剩余的球放在其余箱上进行递归:
def ballPlacing(N,B):
if N <= 0: return int(N==0)
if len(B) == 1:
return int(N<=B[0])
total = 0
for c in range(min(N,B[0])+1):
total += ballPlacing(N-c,B[1:])
return total
print(ballPlacing(3,[3,3,3])) # 10
print(ballPlacing(3,0])) # 4
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。