所有组合用于从给定的橙子和苹果创建水果篮

时间:2016-09-02 17:52:31

标签: 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)中的这个数字?我无法为此找到正确的公式。

4 个答案:

答案 0 :(得分:4)

这个答案将显示如何获得正确的封闭式公式的通用方法,而不是给出“here here it it”公式。

要使用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

答案 1 :(得分:2)

让我们说A_max是组合中可以包含的A个数的最大值,而A_min是必须包含在A中的最小A_max + B_min = N个数任何组合。那么必须满足两个条件:

  1. A_min + B_max = N
  2. A_max
  3. 由于我们知道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)let Source = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content], //Remove errors of all columns of the data source. ColumnName doesn't play any role Cols = Table.ColumnNames(Source), ColumnListWithParameter = Table.FromColumns({Cols, List.Repeat({""}, List.Count(Cols))}, {"ColName" as text, "ErrorHandling" as text}), ParameterList = Table.ToRows(ColumnListWithParameter ), ReplaceErrorSource = Table.ReplaceErrorValues(Source, ParameterList) in ReplaceErrorSource

答案 2 :(得分:-1)

应该是

@{
ViewBag.Title = "Show";
 }
 <!DOCTYPE html>
 <html lang="en">
 <head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

@*<meta http-equiv="Refresh" content="5">*@

<title>Wallboard B</title>
<link type="text/css" rel="stylesheet" href="~/cssNew/bootstrap.min.css">
<link type="text/css" rel="stylesheet" href="~/cssNew/style.css">
<link rel="icon" type="image/png" href="images/favicon.png">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400" rel="stylesheet">
<!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->


</head>

答案 3 :(得分:-3)

好的,对不起,我的方式太快了。

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

你必须至少取A的果实,以便用B得到N.你得到最大A的果实。如果它大于N,则限制为N.所以答案应该是:

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