Alle Kombinationsmöglichkeiten berechnen (180 Punkte auf 4 Felder aufteilen)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Alle Kombinationsmöglichkeiten berechnen (180 Punkte auf 4 Felder aufteilen)

    Guten Abend Easy Coding :)

    Bein Kopf streikt gerade ein wenig. Ich habe insgesamt 180 Punkte auf 4 Felder zu verteilen. Nun brauch ich eine Möglichkeit alle der möglichen Aufteilungen zu berechnen. Habt ihr eine Idee, wie ich das ganze anstellen kann? (Programmiersprache ist egal. Ich brauch nur einen Ansatz, um das in C++ zu schreiben. ;))

    Mögliche Ergebnisse:

    180 - 0 - 0 - 0
    179 - 0 - 0 - 1
    179 - 0 - 1 - 0
    0 - 1 - 0 - 179
    50 - 130 - 0 0

    .
    .
    .

    Habe mir überlegt für [0 - 180] alle Permutation für die 4 Felder berechnen und dann prüfen, welche 180 ergeben. Da das nicht sehr performant ist und ich den selben Algorithmus auf ein Beispiel mit 20 Feldern und 600 Punkten anwenden muss, fällt die Möglichkeit definitiv weg. (Edit hat bemerkt, dass das Schwachsinn ist ^^)

    Schonmal vielen Dank :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Active Record ()

  • Nach mehrstündigem Tüfteln mit einem Mathematiker, sind wir auf ein Ergebnis gekommen (falls es interessiert ;)):

    Noch in unschönem Stil:

    Quellcode

    1. #include <iostream>
    2. #include <string>
    3. #include <vector>
    4. #include <sstream>
    5. template <typename T>
    6. std::string numberToString (T Number)
    7. {
    8. std::ostringstream ss;
    9. ss << Number;
    10. return ss.str();
    11. }
    12. void showCategories(unsigned int categories[]) {
    13. std::string tmp = numberToString(categories[0]);
    14. for(unsigned int i = 1; i <= 3; i++) {
    15. tmp += ("-" + numberToString(categories[i]));
    16. }
    17. std::cout << tmp << " ";
    18. }
    19. int main(int argument_count, char* argv[]) {
    20. /*
    21. * Initalisierung
    22. */
    23. const unsigned int sum = 180;
    24. const unsigned int rows = 3;
    25. unsigned int categories[rows];
    26. // Füllen des Kategorien Arrays mit 0-Werten
    27. for(unsigned int i = 0; i <= rows; i++)
    28. {
    29. categories[i] = 0;
    30. }
    31. categories[0] = sum;
    32. /*
    33. * Berechnung der möglichen Kombinationen
    34. */
    35. unsigned int n = 0;
    36. unsigned int tmp_sum = 0;
    37. unsigned int counter = 0;
    38. while(categories[rows] != sum)
    39. {
    40. counter++;
    41. tmp_sum = 0;
    42. for(int i = 0; i <= rows; i++)
    43. {
    44. tmp_sum += categories[i];
    45. if(tmp_sum == sum) {
    46. n = i;
    47. break;
    48. }
    49. }
    50. if(n < rows)
    51. {
    52. --categories[n];
    53. ++categories[n + 1];
    54. }
    55. else if(n == rows)
    56. {
    57. if(categories[rows - 1] != 0)
    58. {
    59. ++categories[rows];
    60. --categories[rows - 1];
    61. }
    62. else
    63. {
    64. categories[rows] = 0;
    65. unsigned int lastIndex = 0;
    66. for(int i = 0; i <= rows; i++)
    67. {
    68. if(categories[i] > 0) {
    69. lastIndex = i;
    70. }
    71. }
    72. --categories[lastIndex];
    73. unsigned int sum_t = 0;
    74. for(int i = 0; i <= lastIndex; i++)
    75. {
    76. sum_t += categories[i];
    77. }
    78. categories[lastIndex + 1] = (sum - sum_t);
    79. }
    80. }
    81. showCategories(categories);
    82. std::cout << std::endl;
    83. }
    84. std::cout << std::endl << "Gesamte Durchläufe: " << counter;
    85. std::cin.ignore();
    86. return 0;
    87. }
    Alles anzeigen