给定数量的添加的给定答案的总概率

时间:2013-07-26 08:36:35

标签: algorithm combinatorics

我正在做C ++,我想找出最简单的方法来找到给定数量的添加的给定答案的总概率。

例如,给定的答案是5,并且给定的加法数是4(x + x + x + x)。我想要找到的总概率是4:

1) 1 + 1 + 1 + 2 = 5
2) 1 + 1 + 2 + 1 = 5
3) 1 + 2 + 1 + 1 = 5
4) 2 + 1 + 1 + 1 = 5

另一个例子,给定的答案是6,给定的加法数是4(x + x + x + x)。总概率为10:

1) 1 + 1 + 1 + 3 = 6
2) 1 + 1 + 3 + 1 = 6
3) 1 + 3 + 1 + 1 = 6
4) 3 + 1 + 1 + 1 = 6
5) 1 + 1 + 2 + 2 = 6
6) 1 + 2 + 2 + 1 = 6
7) 2 + 2 + 1 + 1 = 6
8) 2 + 1 + 1 + 2 = 6
9) 2 + 1 + 2 + 1 = 6
10) 1 + 2 + 1 + 2 = 6

我完全不知道从哪里开始

3 个答案:

答案 0 :(得分:4)

这是一个开始。

看一下这张表

        1   2   3   4   5
      +------------------
1     | 1   0   0   0   0
2     | 1   1   0   0   0
3     | 1   2   1   0   0
4     | 1   3   3   1   0
5     | 1   4   6   4   1

加数的数量从左到右增加,行的总增加,例如,有3种方法可以将3个整数(大于0)相加,总共4个(即1 + 1 + 2,1 + 2 + 1,2 + 1 + 1)。

答案 1 :(得分:0)

有4个加法和结果Y,如果所有数字都是正数且非零并且足够小(<100),你可以轻松地至少强行执行此操作...只需循环所有数字4x用于循环并且如果它们总和最多Y个增量排列数。缺点是复杂度O(N ^ 4)将非常慢。

#include <iostream>
using namespace std;

int main()
{
    int y = 6;
    int perm = 0;

    for(int a = 1; a < y; a++)
    for(int b = 1; b < y; b++)
    for(int c = 1; c < y; c++)
    for(int d = 1; d < y; d++)
    {
        if((a+b+c+d)==y)
        {
            cout << a << " + " << b << " + " << c << " + " << d << " = " << y  << endl;
            perm++;
        }
    }
    cout << "number of permutations: " << perm << endl;
}

答案 2 :(得分:0)

这不是概率您要查找的内容,而是number of comibnations

查看您的示例,我假设您添加的数字是固定的(即4),因此每个数字都大于或等于1 。我们可以在这里做简单的数学运算 - 让我们从等式的两边减去这个数字:

原文:1)1 + 1 + 1 + 2 = 5 减法结果:1)0 + 0 + 0 + 1 = 1

减法完成后,您的问题就是combination with repetition问题。

您可以在我提供的链接中找到的公式非常简单。可以使用以下代码解决问题:

#include <iostream>

unsigned factorial(int n)
{
    if (n == 1) return 1;
    return n * factorial(n-1);
}

unsigned combinationsWithRepetition(int n, int k)
{
    return factorial(n + k - 1) / (factorial(k) * factorial(n - 1));
}

unsigned yourProblem(unsigned numberOfNumbers, unsigned result)
{
    return combinationsWithRepetition(numberOfNumbers, result - numberOfNumbers);
}

int main()
{
    std::cout << yourProblem(4, 5) << std::endl;
    std::cout << yourProblem(4, 6) << std::endl;
    return 0;
}

此外,您可以在online compiler中查看此代码。

请注意,此代码仅涵盖问题解决,如果您选择使用它,则可以进行改进(即,它不受无效值保护)。