Algorithm combination

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

  • Algorithm combination

    Also ich brauche einen Algorithmus der mir alle moeglichen Kombinationen bis zu einem bestimmten Wert liefert!
    z.B. Der max Wert soll 11 sein und array mit Werten {4, 3, 5} soll folgendes liefern:
    4, 4, 3
    4, 3, 3
    3, 4, 4
    3, 3, 5
    3, 3, 3
    3, 4, 3
    5, 4
    5, 3, 3
    (Hoff ich hab alle)

    Also bisher hab ich sowas:

    Quellcode

    1. int arr[4] = {2, 1, 6, 3};
    2. int value = 0;
    3. int tmpV = 0;
    4. for (int i=0; i<c; i++) {
    5. value += arr[i];
    6. tmpV = value;
    7. std::cout << arr[i] << " " << arr[i] << " ";
    8. for (int k=0; k<c; k++) {
    9. if ((value + arr[k]) <= summationsLength) {
    10. value += arr[k];
    11. tmpV = value;
    12. std::cout << arr[k] << " " << arr[k] << " ";
    13. }
    14. for (int j=k; j<c; j++) {
    15. if ((value + arr[j]) <= summationsLength) {
    16. value += arr[j];
    17. std::cout << arr[j] << " " << arr[j] << " ";
    18. }
    19. }
    20. value = tmpV;
    21. }
    22. value = 0;
    23. std::cout << std::endl;
    24. }
    Alles anzeigen


    Leider funktioniert der nicht richtig weis vlt wer ne Loesung??
  • Ich habe den Algorithmus in Python geschrieben, darin gehen mir die Codes schneller von der Hand. Nach C darfst du ihn dann portieren. ;)

    Quellcode

    1. def per(menge, maximum, rekursionen=[]):
    2. for element in menge:
    3. r = rekursionen[:] # Kopie der Liste rekursionen erstellen
    4. r.append(element)
    5. if sum(r) <= maximum:
    6. print r,
    7. per(menge, maximum, r) # Rekursiver Aufruf

    An deinem Beispiel angewandt:

    Quellcode

    1. >>> per([3, 4, 5], 11)
    2. [3] [3, 3] [3, 3, 3] [3, 3, 4] [3, 3, 5] [3, 4] [3, 4, 3] [3, 4, 4] [3, 5] [3, 5, 3] [4] [4, 3] [4, 3, 3] [4, 3, 4] [4, 4] [4, 4, 3] [4, 5] [5] [5, 3] [5, 3, 3] [5, 4] [5, 5]

    Listet alle Kombinationen bzw. Permutationen auf, deren Summe kleiner gleich 11 ist. Kann man aber sicherlich noch optimieren.
  • Danke fuer die Antwort leider hab ich noch nie Python programmiert...
    Habs versucht umzusetzen komm auf sowas:

    Quellcode

    1. int COUNT = 0;
    2. void permutation(int m[], int max, int *v) {
    3. int size = (sizeof(m)/sizeof(*m));
    4. for (int i=0; i<size; i++) {
    5. int *k = new int[size];
    6. k = v;
    7. k[COUNT] = m[COUNT];
    8. COUNT++;
    9. int sum = 0;
    10. int j=0;
    11. int s = (int) sizeof(k)/sizeof(*k);
    12. while (j < s) {
    13. sum+=k[j];
    14. j++;
    15. }
    16. if (sum <= max) {
    17. int w=0;
    18. while (w < s) {
    19. std::cout << k[w];
    20. w++;
    21. }
    22. }
    23. std::cout << std::endl;
    24. permutation(m, max, k);
    25. }
    26. }
    Alles anzeigen


    Funktioniert aber nicht weis vlt wer wo der Fehler liegt?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Freaky256 ()