Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Kombinationen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.03.2006, 07:57 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Mahlzeit... Hat zwar nur bedingt mit ansi-c zu tun aber ich pack es trotzdem mal hier rein in der hoffnung es gibt in der stl oder so etwas das das schon kann....

Ich suche nach nem Algo/funktion die mir folgendes liefert...

Ich übergebe die Menge an Elementen x und der Algo liefert mir für ein n kleiner Anzahl Elemente x alle möglichen Kombinationen die sich bilden lassen für genau einmal ziehen bis n-mal ziehen. Es soll ein ziehen ohne zurücklegen sein und die reihenfolge ist auch schnuppe...


also Beispiel.. Ich habe die Zahlen 1,2,3,4,5,7

Ich wähle mal n=4...

Jetzt will ich habe...
Die "Einser" 1,2,3,4,5,6,7
Die "Zweier" (1,2), (1,3)... (1,7) (2,3), (2,4)...(2,7) ... (6,7)
Die "Dreier" (1,2,3) (1,2,4) ...
und die Vierer (1,2,3,4) , (1,2,3,5).....
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 28.03.2006 um 07:58 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.03.2006, 17:23 Uhr
Pler
Einer von Vielen
(Operator)


So, jetzt habe ich das ungefähr sieben mal gelesen und endlich kapiert was du eigentlich willst.



Auf anhieb fällt mir nichts besseres ein, als das selber zu programmieren. Dabei musst du schon alles durchgehen.

Ansonsten: Wir sind kein Hausaufgabenforum! Mach deine Arbeit selber
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.03.2006, 22:37 Uhr
kronos
Quotenfisch
(Operator)


In welcher Form willst du die Tuppel geliefert?
Einfach quer Beet 'rausschreiben?

Bearbeitung:
Ich find's übrigens unverschämt, sowas nicht in der Rätselecke zu posten...

--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 30.03.2006 um 11:49 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.04.2006, 00:36 Uhr
Lensflare



Also für die anzahl aller möglichen Kombinationen müsste folgendes gelten:

Code:
x = menge an elementen
n = n-mal ziehen
anzahl aller möglichkeiten = summe von ( x!/((x-a)! * a!) ) mit a = 1 bis n



aber du willst wahrscheinlich die Kombinationen selbst, oder?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 01.04.2006 um 00:40 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.04.2006, 01:21 Uhr
kronos
Quotenfisch
(Operator)


Wahrscheinlich hat er eh längst vergessen, was er damit wollte, aber irgendwie hab' ich gerade nix besseres zu tun

C++:
void f(int A[], int n, int x, std::vector<int> V)
{
    if(n--)
        while(x-->0)
        {
            V.push_back(A[x]);
            // Hier den vector abgreifen
            f(A,n,x,V);
            V.pop_back();
        }
}



Bearbeitung:
aja, aus den x Zahlen in A werden bis zu n gezogen

--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 01.04.2006 um 01:23 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.04.2006, 02:25 Uhr
Lensflare



Also hab mich mal hingesetzt und den Algorythmus erarbeitet:


C++:
    const int x = 7;
    const int n = 4;
    
    char vorrat[x] = {'a','b','c','d','e','f','g'};
    int kombi[x] = {0,0,0,0,0,0,0};
    
    for(int i = 1; i <= n; i++)
    {
      bool end = false;
      while(!end)
      {
        int a = 0;
        for(int p = 0; p <= i-1; p++)
        {
          for(int q = 0; q <= i-1; q++)
          {
            if(kombi[p] == kombi[q]) a += 1;
          }
        }
          
        if(a == i)
        {
          for(int r = 0; r <= i-1; r++)
          {
            printf("%c",vorrat[kombi[r]]);
          }
          printf(" ");
        }
        
        kombi[0] += 1;
        
        for(int j = 0; j <= i-1; j++)
        {
          if(kombi[j] == x)
          {
            kombi[j] = 0;
            if(j < i-1) kombi[j+1] += 1;
            else end = true;
          }
        }
      }
      
      printf("\n");
      
    }
    
    getchar();



Diese Lösung ist sicher nicht optimal aber sie liefert ein richtiges Ergebnis so weit ich das überprüfen konnte.

Die Elemente habe ich mit Buchstaben ersetzt.

@kronos:
Was passiert in dem code, den du gepostet hast?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.04.2006, 02:36 Uhr
Lensflare



oder für eine bessere Darstellung folgendes ersetzen:

C++:
/*
        kombi[0] += 1;
        
        for(int j = 0; j <= i-1; j++)
        {
          if(kombi[j] == x)
          {
            kombi[j] = 0;
            if(j < i-1) kombi[j+1] += 1;
            else end = true;
          }
        }
*/


//Besser lesbar:

        kombi[i-1] += 1;
        
        for(int j = i-1; j >= 0; j--)
        {
          if(kombi[j] == x)
          {
            kombi[j] = 0;
            if(j > 0) kombi[j-1] += 1;
            else end = true;
          }
        }



also von rechts nach links zählen statt umgekehrt
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 01.04.2006 um 02:38 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.04.2006, 11:58 Uhr
kronos
Quotenfisch
(Operator)



Zitat von Lensflare:
@kronos:
Was passiert in dem code, den du gepostet hast?

rat mal :-)
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.04.2006, 13:34 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Besten Dank. Hab mir das auch schon gebastelt gehabt und preconditions gesetzt damit bestimmte Kombinationen gar nicht erst weiter bearbeitet werden. Ist für mich erstmal gestorben. Dauert einfach zu lange. Ich hatte gehoft die "Fakultät" besser überlisten zu können
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: