我想计算一下将一些随机瓶放入箱子里的可能性。我得到三个常数。
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个可能性中,用什么方法来表达结果?我怎样才能形成一个正确的公式,所以我得到了正确的可能性?任何帮助,将不胜感激。 :)
答案 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