用3个常数计算可能性的算法?

时间:2015-10-06 14:11:11

标签: algorithm math permutation combinatorics

我想计算一下将一些随机瓶放入箱子里的可能性。我得到三个常数。

N = Count of Bottles
k = Count of Crates
K[num] = How many Bottles fit inside ONE Crate

示例:

N = 7; // 7 Bottles
k = 2; // 2 Crates
K1 = 3; // Crate 1 -> max 3 Bottles
K2 = 5; // Crate 2 -> max 5 Bottles

Above equals to 2 Possibilities:
1: First Crate 1 -> 3 bottles, Second crate -> 4 Bottles
2: First Crate -> 2 bottles, Second crate -> 5 Bottles

我的问题是,在我的例子,2个可能性中,用什么方法来表达结果?我怎样才能形成一个正确的公式,所以我得到了正确的可能性?任何帮助,将不胜感激。 :)

2 个答案:

答案 0 :(得分:1)

您可以使用动态编程来查找T(n,k),这意味着“我们可以用n瓶装满第k个箱子的方式”。

T(0, 0) = 1
T(n, 0) = 0
T(n, k) = sum{1<=i<=K[k], T(n-i, k-1)}

这是Python中的一个示例实现(使用递归,非memoized):

def T(n, k, K):
    if k==0: return n==0
    return sum(T(n-i, k-1, K) for i in xrange(1, K[k-1]+1))

print T(7, 2, [3, 5])

答案 1 :(得分:0)

您正在寻找形式

的线性方程的所有非负解
x[1] + x[2] + . . . + x[k] = N

0 <= x[i] <= K[i]

其中x[i]是包装箱i

中的瓶数

我相信这是组合学中Real Donut Shop Problem的一个例子。关于数学SE也存在类似的问题。

https://math.stackexchange.com/questions/223345/counting-donuts

由于你需要实际显示结果,这应该是足够的信息来在一个循环中实现逻辑,覆盖适合方程的所有可能的X值集。

有关数学的更多信息,请参阅https://arts-sciences.und.edu/math/_files/docs/courses/supp/math-408/math-408-notes-b.pdf