Robię C ++ i chcę znaleźć najprostszy sposób na znalezienie całkowitego prawdopodobieństwa danej odpowiedzi danej liczby dodatków.
Na przykład podana odpowiedź to 5, a podana liczba dodatków to 4 (x + x + x + x). Całkowite prawdopodobieństwo, które chcę znaleźć, wynosi 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
Inny przykład, podana odpowiedź to 6, a podana liczba dodatków to 4 (x + x + x + x). Całkowite prawdopodobieństwo wynosi 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
Nie mam absolutnie pojęcia, od czego zacząć
Odpowiedzi:
4 dla odpowiedzi № 1Oto początek dla ciebie.
Spójrz na ten stół
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
Liczba szczytów wzrasta od lewej do prawej, całkowity wzrost w rzędach, np. istnieją 3 sposoby sumowania 3 liczb całkowitych (większych niż 0) w sumie 4 (mianowicie 1 + 1 + 2, 1 + 2 + 1, 2 + 1 + 1).
0 dla odpowiedzi nr 2
Z 4 dodatkami i wynikiem Y, jeśli wszystkie liczbybędzie dodatni i niezerowy oraz wystarczająco mały (<100), możesz to łatwo przynajmniej brutalnie wymusić ... po prostu cykluj wszystkie liczby z 4x dla cykli i jeśli sumują się do przyrostu Y liczby permutacji. Wadą jest złożoność O (N ^ 4), która będzie bardzo powolna.
#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;
}
0 dla odpowiedzi № 3
To nie jest prawdopodobieństwo co próbujesz znaleźć, to jest number of comibnations
.
Patrząc na twoje przykłady, zakładam, że liczba liczb dodajesz jest naprawiony (tj. 4), więc każda liczba jest większa lub równa 1. Możemy tutaj zrobić prostą matematykę - niech odejmą tę liczbę z obu stron równania:
Oryginał: 1) 1 + 1 + 1 + 2 = 5
Wynik odjęcia: 1) 0 + 0 + 0 + 1 = 1
Po zakończeniu odejmowania, twoim problemem jest połączenie z powtórzeniem problem.
Formuły, które można znaleźć w podanym przeze mnie linku, są dość proste. Problem można rozwiązać za pomocą następującego kodu:
#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;
}
Możesz także sprawdzić ten kod w kompilator online.
Pamiętaj, że ten kod obejmuje tylko rozwiązywanie problemów i może zostać ulepszony, jeśli zdecydujesz się go użyć (tzn. Nie jest chroniony przed nieprawidłowymi wartościami).