Mam problem:
znalazlem kod w ksiazce "Kombinatoryka dla programistow" kod generujacy kombinacje k-elementowe ze zbioru n-elementowego bez powtorzen.
Kod dziala - lecz dziala tylko dla ciagu liczb rozniacych sie o 1 miedzy soba, czyli {1,2,....,n-1,n}. Ja natomiast musze wygenerowac kombinacje k-elementowa ze zbioru liczb losowych (posortowanych rosnaco) i w takim wypadku ten kod nie dziala.
#include <cstdlib>
#include <iostream>
using namespace std;
int K,N=20,w,p,i,l=0,o;
int tab[20];
int main()
{
w=10;
K=(w-1);
//petla wypelnia tablice
for(i=0;i<20;i++){
tab[i]=(i+1);
};
p=K;
o=tab[19];
do
{
// funkcja generujaca podzbiory
if(tab[K]==o) // jezeli liczba na ostatnim miejscu w tabeli jest rowna najwiekszej liczbie z generowanego zbioru, zmniejszamy liczbe p o 1
{
p=p-1;
}
else p=K; // jezeli nie liczba p jest liczba k
if(p>=0) // jezeli p jest wieksze od 0 to zapetlamy wyrazenie od konca i zastepujemy wyraz na ostatnim miejscu w tablicy liczba o jeden wieksza
for(i=K;i>=p;i--)
{
tab[i]=tab[p]+i-p+1;
};
for(i=0;i<10;i++){
cout<<tab[i]<<" ";}
cout<<"\n\n"<<l<<" ";
l++;
}while(p>=0);
cout<<"\n\nilosc kombinacji to: "<<l<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Mysle, ze problem lezy w linii:
tab[i]=tab[p]+i-p+1;
Bo zamiast odwolywac sie do kolejnego elementu w tablicy, zwieksza na "sucho" element o 1, ale nie potrafie sobie poradzic z "naprawieniem" kody tak, zeby dzialal dla dowolnego ciagu liczb - nie tylko dla (n+1).