algorithm - 用给定的橙子和苹果制作水果篮的所有组合

标签 algorithm math combinations

假设给你 A 橙子和 B 苹果。您想要创建一篮子总共有 N 个水果。你一共可以做出多少个苹果和橘子的组合?
假设 A+B >= N

示例:
我有 6 个橙子和 6 个苹果,我想制作一个总共有 9 个水果的篮子。
所以我有 4 种不同的组合:

3 apples 6 oranges
4 apples 5 oranges
5 apples 4 oranges
6 apples 3 oranges

我想创建一个简单(高效)的算法来计算这个数字。
是否有任何数学/组合方法来计算 O(1) 中的这个数字?我找不到正确的公式。

最佳答案

这个答案将展示如何获得正确封闭公式的通用方法,而不是给出“在这里,它有效”的公式。

要获得一个封闭的公式,请使用 Stars and Bars formulaInclusion Exclusion ,你想找到方程解的数量:

x1 + x2 = n
s.t.
(1) 0 <= x1 <= A
(2) 0 <= x2 <= B

表示:

W(0) = #solutions to the problem regardless of restrictions
W(1) = #solutions to the problem with (1) is NOT correct (x1 > A)
W(2) = #solutions to the problem with (2) is NOT correct (x2 > B)
W(1,2) = #solutions to the problem with both (1,2) NOT correct (x1 > A and X2 > B)

根据包含排除原则,我们上面形式化的问题的答案是:

E = W(0) - (W(1) + W(2)) + W(1,2)

剩下的就是为 W(...) 提供公式,为此我们将使用星号和条号。

利用条形和星形的无约束方程和定理 2:

W(0) = Choose(N + 2 - 1, 2 - 1) = Choose(N + 1, 1) = N + 1 

为了计算 W(1) 和 W(2),我们强制 x1/x2A+1B+1 ,然后照常进行,得到方程式:

x1 + x2 = N - A - 1
x1 + x2 = N - B - 1

解的数量是(再次使用定理 2):

W(1) = Choose(N - A - 1 + 2 - 1, 1) = Chose(N-A,1) = max{N-A,0}
W(2) = (similarly) = max{N-B,0}

对于 W(1,2) 我们设置两者并继续得到:

W(1,2) = Choose(N - A - 1 - B -1 + 2 - 1) = Choose(N-A-B-1,1) = max{N-A-B-1,0}

将所有这些加在一起得到最终公式:

E = W(0) - (W(1) + W(2)) + W(1,2) = 
  = N + 1 - max{N-A,0} - max{N-B,0} + max{N-A-B-1,0}

在你的例子中是:

E = 9 + 1 - 3 - 3 + 0 = 4

关于algorithm - 用给定的橙子和苹果制作水果篮的所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39298217/

相关文章:

algorithm - 预测国际象棋比赛中输赢的机会

javascript - 我的排序算法的时间复杂度应该是多少?

python - 通过恰好 k 次买卖股票获得最大利润

javascript - Math.abs() 限制小数位数

mysql - 删除MySQL中的重复组合

haskell - mapM 如何与 Haskell 中的 const 函数一起工作?

使用 tidyr/data.table 与 data.frames 复制 `expand.grid()` 行为

algorithm - 数学题 : how to blit correctly a "rotated" surface on another one

math - 查找与虚数相邻的函数的根

math - 如何使用 CSS3 围绕 X=0、Y=0 和 Z=0 以外的线旋转元素?