我正在做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
我完全不知道从哪里开始
答案 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中查看此代码。
请注意,此代码仅涵盖问题解决,如果您选择使用它,则可以进行改进(即,它不受无效值保护)。