用于生成“垃圾箱中的球”结果并限制垃圾箱大小的算法?

如何解决用于生成“垃圾箱中的球”结果并限制垃圾箱大小的算法?

假设我们有 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?