【问题标题】:All combination for creating a fruit basket from given oranges and apples用给定的橙子和苹果制作水果篮的所有组合
【发布时间】:2016-09-02 17:52:30
【问题描述】:

假设给你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) 中的这个数字?我找不到正确的公式。

【问题讨论】:

    标签: algorithm math combinations


    【解决方案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
    

    【讨论】:

    • 这是一个很好的解释,似乎适用于我尝试过的每个示例。您只需要修正最终公式中的拼写错误,它在 max{N-A,0} 而不是 max{N-B,0} 上计算 W(2)。
    • @BrianStephens 谢谢,在您输入评论时正在这样做。
    • 非常感谢您提供这个正确且解释清楚的解决方案。我不会想到使用包含排除。我想我需要刷新我对组合学的记忆。
    【解决方案2】:

    假设A_max 是可以包含在组合中的A 的最大数量,A_min 是必须包含在任何组合中的A 的最少数量。那么就会有两个条件必须满足:

    1. A_max + B_min = N
    2. A_min + B_max = N

    因为我们知道A_max(即min(NumOfA, N)),所以B_min 可以很容易地从第一个等式中找到。同样,可以从第二个等式中找到A_min。 因此,组合列表将是:

    A_max + B_min

    (A_max-1) + (B_min+1)

    (A_max-2) + (B_min+2)

    ...

    (A_min) + (B_max)

    因此,此类组合的计数将是 (A_max - A_min + 1)(B_max - B_min + 1)

    【讨论】:

      【解决方案3】:

      应该是

         ans = (A + B) - N + 1
      

      【讨论】:

      • 没有。以总共 4 种水果为例。你有 10 个苹果和 1 个橙子。组合的总数是 2。要么是 1 个橙子和 3 个苹果,要么是 0 个橙子和 4 个苹果。从另一个答案复制评论。
      • 对不起,我的错误。
      • 我从另一个不令人满意的答案中复制了作者的评论。如果 A 是 10 B 是 1 并且 N =4...答案应该是 ans=2(可以生成两对 (A,B)=(4,0 ) 或 (A,B)=(3,1)) 但您的公式将给出ans=8
      • 还在想办法
      【解决方案4】:

      好的,抱歉,我(方式)太快了。

      你知道至少有一个解决方案。

      你必须至少取足够多的 A 果实,这样与 B 就可以得到 N。你最多可以取 A 的 A 果实。如果大于 N,则限制为 N。所以答案应该是:

      min(A, N) - max(0, N-B) + 1
      

      【讨论】:

      • 没有。以总共 4 种水果为例。你有 10 个苹果和 1 个橙子。组合的总数是 2。要么是 1 个橙子和 3 个苹果,要么是 0 个橙子和 4 个苹果。
      • 再解释一下:min(A,N) 是你可以取的 A 的最大数量。 max(0, N-B) 是您需要的 A 的最小数量。因此,差异始终为正或 0(因为 A + B >= N)。差加 1 就是解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多