Kombinatorika

poruka: 25
|
čitano: 9.855
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
neaktivan
offline
Kombinatorika

Zanima me kako napisati program u c++ koji bi pronalazio koliko ima mogučih kombinacija i ispisivao ih?

Da pojasnim:

imamo niz u koji unesemo 4 broja i cilj programa je pronaći koliko je mogučih četveroznamenkstih brojeva koji su načinjeni od tih brojeva

 

ili

 

u niz unesemo nekoliko brojeva čiji zbroj je 100 i zanima nas na koliko  sve načina možemo dobiti zbroj 51 ili više

 

glavnina onog što me zanima je kako kombinirati prvo polje niza sa ostalima u nizu, pa onda drugo polje sa svima pa i sa prvim, i tako dalje

 

ako je moguće molio ih i pojašnjenje budući da tek počinjem sa programiranjem ovakvih zadataka

 

:) hvala unaprijed

 

q8200,radeon4870 1gb, 8gb kingmax 1066 intel i ati moj prvi i jedini izbor sve se da kupiti novcem, ali osjećaj gta 4 u najvećim detaljima:neprocjenjivo
 
0 0 hvala 0
17 godina
offline
RE: Kombinatorika
pfliper kaže...

Zanima me kako napisati program u c++ koji bi pronalazio koliko ima mogučih kombinacija i ispisivao ih?

Da pojasnim:

imamo niz u koji unesemo 4 broja i cilj programa je pronaći koliko je mogučih četveroznamenkstih brojeva koji su načinjeni od tih brojeva

 

ili

 

u niz unesemo nekoliko brojeva čiji zbroj je 100 i zanima nas na koliko  sve načina možemo dobiti zbroj 51 ili više

 

glavnina onog što me zanima je kako kombinirati prvo polje niza sa ostalima u nizu, pa onda drugo polje sa svima pa i sa prvim, i tako dalje

 

ako je moguće molio ih i pojašnjenje budući da tek počinjem sa programiranjem ovakvih zadataka

 

:) hvala unaprijed

 

kombinacije sa ponavljanjima.. 

znaci, prvo se upoznati sa osnovama kombinatorike...

;-)

16 godina
neaktivan
offline
RE: Kombinatorika

hvala na pomoći....Plač

q8200,radeon4870 1gb, 8gb kingmax 1066 intel i ati moj prvi i jedini izbor sve se da kupiti novcem, ali osjećaj gta 4 u najvećim detaljima:neprocjenjivo
16 godina
neaktivan
offline
RE: Kombinatorika

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    int a,j,i,k,l,c;
    c=0;
    cin>>a;
    int niz[a];
    int x;
           for (x=0;x<a;x=x+1)
        {
            cin>>niz[x];
            }
    for (j=0;j<4;j=j+1)
    {
       
          for (i=0;i<4;i=i+1)
        {
          
            for (k=0;k<4;k=k+1)
            {  
                for (l=0;l<4;l=l+1)
                {
                cout<<niz[j];
                cout<<niz[i];
                cout<<niz[k];        
                cout<<niz[l]<<endl;
                c=c+1;                    }
                    }
                    }
                    }
                    cout<<"ima ih"<<c;
system("PAUSE");
return 0;
}

 

uspio sam za četveroznamenakste brojve

ali problem je što ovaj način pisanja programana nije moguće mijenjati nego ako želim za peteroznamenkaste brojeve moram ubacit još jednu for petlja

 

 

ima li kakav način da umjesto svih ovih for petlji koristim jedan kod ili jednu petlju za n-znamenkasti broj?

q8200,radeon4870 1gb, 8gb kingmax 1066 intel i ati moj prvi i jedini izbor sve se da kupiti novcem, ali osjećaj gta 4 u najvećim detaljima:neprocjenjivo
16 godina
neaktivan
offline
RE: Kombinatorika

link,stranica 24 za prvi zadatak.

A ovo drugo nema neku matematičku formulaciju (iako bi se dalo nešto napravit, sjećam se sličnih zadataka iz diskrete matematike), tu mislim da ćeš imat više koristi od neke tehnike dinamičkog programiranja.

Možda čak spremat u matrice neke sume pa kasnije čitat. Nemam neku pametnu ideju odmah na prvu, siguran sam da tu ima natjecatelja iz programiraja, oni su dosta takvih zadataka riješili :D

Glory Glory Man United !!
17 godina
offline
Kombinatorika

Broj kombinacija možeš računati matematički npr. broj kombinacija sa ponavljanjem niza od n elemenata sa r razredom elemenata:

 

 

#include<iostream>

using namespace std;

 

 

 

int kombinacije(int n) {

if(n==0) return 1;

return n * kombinacije(n-1);

 

 

}

 

void main() {

int n, r, k;

cout<< "Unesi broj elemenata: "; cin>> n;

cout<< "Unesi broj elemenata razreda koji se ponavljaju: "; cin>> r;

k = n+r-1;

cout<< "Broj kombinacija sa ponavljanjem u nizu od " << n << " elemenata " <<  " sa razredima od " << r << " elemenata: " <<

(kombinacije(k)/((kombinacije(r))*kombinacije(k-r))) << endl;

}

 
0 0 hvala 0
17 godina
offline
Kombinatorika

Međutim, ako ćeš kombinacije ispisati onda moraš uzeti i dovoljan broj petlji i uvjete za ispis shodno vrsti kombinatorike.

međutim, možda netko zna drugi način

 
0 0 hvala 0
16 godina
neaktivan
offline
RE: Kombinatorika

koliko ja znam broj mogučih kombinacija može se izračunati pomoću nekoliko matematičkih formula

mene konkretno zanima kako bi se mogao isprogramirati program koji bi ispitivao sve moguče kombinacije između brojeva koje mu se zadaju

 

recimo danas mi se po glavi vrzma problem kako ispitati koji su zbrojevi brojeva u nekom nizu djeljivi s 10

 imamo niz od 15 brojeva i i sad me zanima koji su sve zbrojevi djejivi s 10( može biti dva+jedan;tri+jedan;jedan+dva+tri...)

ako me tko razumije..

q8200,radeon4870 1gb, 8gb kingmax 1066 intel i ati moj prvi i jedini izbor sve se da kupiti novcem, ali osjećaj gta 4 u najvećim detaljima:neprocjenjivo
16 godina
neaktivan
offline
RE: Kombinatorika

Zvuči mi ko neka rekurzija...

 

int brojac=0;

void fja(int*niz, int duljina, int suma,int iduci)

{

       if (suma%10==0) ++brojac;

       fja(niz,duljina, suma+niz[iduci],iduci+1);

       fja(niz, duljina,suma,iduci+1);

}

 

nešto takvo (sa još provjerom dal idući ispada iz niza). Dakle u svakom koraku rekurzije pogledat kaj se desi sa sumom kad joj dodamo idući element i kad ne dodamo. I tako vrtit

 

p.s. ovo je samo ideja :D

Glory Glory Man United !!
Poruka je uređivana zadnji put uto 6.7.2010 15:53 (Luuka).
15 godina
neaktivan
offline
Kombinatorika

Sve se to moze na jednostavan nacin rijesiti pomocu rekurzije, ali naravno cim se problem malo zakomplicira, rekurzija postane neprakticna. Npr. za niz od 15 (razlicitih, da ne kompliciramo) brojeva da bi pomocu rekurzije ispitao sve kombinacije terba ti 2^15 = 32768 kombinacija, sto je prakticki nikakvo vrijeme racunanja, no ako uzmes 50 brojeva, stvari se naglo kompliciraju jer rekurzijom neces bas daleko dospijeti kad treba ispitati 10^15 kombinacija.

 

Zato se u principu takvo brute force rjesenje koristi iznimno rijetko, te se stvari rjesavaju na drugaciji nacin.

 

Znaci u onom prvom zadatku, dobijes 4 broja, koji (pretpostavljam) ne moraju biti razliciti. Ako niti jedna znamenka nije 0, onda je rezultat n! / (k1! * k2! * ... ), dje je n ukupan broj znamenaka, a k1 oznacava koliko puta smo dobili znamenku 1 itd.

Ako se 0 pojavljuje bar jednom, onda imamo nesto manje kombinacija jer ne smije biti prva znamenka, pa imamo (n - 1) * (n - 1)! / (k0! * k1! * ...)

Naravno, u tvom slucaju je n = 4, ali ovo vrijedi za bilo koji n.

 

Ako zelis bas ispis tih brojeva, onda ipak moras koristiti rekurziju, ako bas ne znas kako, pitaj pa cu ti napisati neku :)

 

 

Drugi zadatak mozemo rijesiti modificiranom rekurzijom (mislim da se to zove pruning - obrezivanje (stabla) ). Ideja je da moras isprobati sve kombinacije, svaki broj mozemo ili ukljuciti ili ne ukljuciti cime dobivamo binarno stablo:

 

 

      Korijen

    0         a1

0      a2   a1       a1 + a2

 

i tako dalje, znaci na svakom nivou mozes odredeni broj ili dodati ili ne dodati svim kombinacijama prethodnih. Cvorove na zadnjem nivou zovemo listovi i oni predstavljaju sve moguce kombinacije. Mozemo jednostavno izbrojati koliko listova ima sa zbrojem 51 i to je rjesenje, ali buduci da taj broj jako divlja (opet imamo 2^n listova), da bismo ubrzali proces, uocimo da ako je u nekom cvoru zbroj vec veci od 51, nema smisla dalje gledati (ukoliko su naravno svi brojevi pozitivni), p asve ispod toga cvora mozemo zanemariti (odrezati granu), i idemo na slijedeci cvor, sto nam moze drasticno ubrzati treazenje rjesenja. Nazalost, ovo je cesto prilicno sporo (npr kad imamo puno malih brojeva). Ovdje nam poseban problem i stvara ako dozvolimo da brojevi budu negativni (nema pruninga) ili 0 (moramo posebno obraditi)

 

Alternativno, i naravno mnogo brze, mozemo problem rijesiti dinamickim programiranjem:

Svaki broj mozemo uljuciti, ili ne ukljuciti, a cilj nam je stici do 51. Dakle sve sto trebamo je jedno polje a intova duljine 52 u kojem cemo pratiti broj kombinacija za ostvarivanje tog zbroja i krecemo :)

 

for(int i = 0; i < n; i++)

{

    for(int j = 51; j >= 0; j--)

    {

         if(j + broj[i] <= 51) a[j + broj[i]] + = a[j];    }

}

 

Negativni brojevi nam takoder stvaraju poteskoce, ali to se moze rijesiti tako da umjesto polja koje pamti zbrojeve koristimo skup uredenih parova (zbroj, broj pojavljivanja).

 

Treci zadatak kasnije jer mi je zavrsilo radno vrijeme :)

Poruka je uređivana zadnji put uto 6.7.2010 23:50 (Grgapm).
Moj PC  
1 0 hvala 0
15 godina
neaktivan
offline
Kombinatorika
Potkrala mi se greskica u dinamickom kod a nemrem editirat s ajfouna. Treba bit nakon if-a a[j + broj[i]] += a[j] ( a ne ++). razmisljao sam o nelom drugom zadacicu pa sam nesvjesno krivo napisao. Polje a treba inicijalizirat na 0, osim a[0]=1
Moj PC  
0 0 hvala 0
17 godina
offline
Kombinatorika

Ovo je broj kombinacija zbrojeva dva broja niza n članova čija je suma djeljva sa 10:

 

 

 

#include<iostream>

using namespace std;

 

int main() {

int *niz,  i, n, j, k=0, suma=0, broj=0;

cout<< "Unesi broj elemenata niza: "; cin>> n;

niz = new int[n];

for(i=0; i<n; i++) {

cout<< "Unesi " << (i+1) << ". element niza: ";

cin>> niz[i];

 

}

for(i=0; i<(n-(n-1)); i++) {

j = i;

k=i;

 

for(j; j<n; j++) {

broj=j;

while(broj<n-1) {

broj++;

if((niz[j] + niz[broj])%10==0) {

cout<< niz[j] << " + " << niz[broj] << " = " << niz[j]+niz[broj] << endl;

suma++;

}

 

 

 

}

 

}

}

cout<< "Broj kombinacija dva broja niza cija je suma djeljiva sa 10: " << suma << endl; 

}

 

 
0 0 hvala 0
17 godina
offline
Kombinatorika

varijabla k je suvišna (da je sad ne brišem)!

Poruka je uređivana zadnji put uto 6.7.2010 21:37 (Floki).
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: Kombinatorika

a ako tražimo sumu tri broja?

jer mene zanima kako napisati program koji će proizvoljno uzimati 3,4,5...n brojeva iz niza i računati njihov zbroj,ispitivati koji je zbroj veći,itd....

q8200,radeon4870 1gb, 8gb kingmax 1066 intel i ati moj prvi i jedini izbor sve se da kupiti novcem, ali osjećaj gta 4 u najvećim detaljima:neprocjenjivo
17 godina
offline
RE: Kombinatorika
pfliper kaže...

a ako tražimo sumu tri broja?

jer mene zanima kako napisati program koji će proizvoljno uzimati 3,4,5...n brojeva iz niza i računati njihov zbroj,ispitivati koji je zbroj veći,itd....

pogledaj možeš li ga preraditi, uglavnom, ovo je način sa iteracijom

ako ne ide, onda rekurzija

16 godina
neaktivan
offline
RE: Kombinatorika

hvala

onda mi ništa ne preostaje nego skužit rekurziju

q8200,radeon4870 1gb, 8gb kingmax 1066 intel i ati moj prvi i jedini izbor sve se da kupiti novcem, ali osjećaj gta 4 u najvećim detaljima:neprocjenjivo
15 godina
neaktivan
offline
Kombinatorika

Ne treba ti rekurzija (jako rijetko optimalno rjesenje trazi rekurziju. Najbolje je opet koristiti dinamicko programiranje, a koristit cemo i jedan mali trik koji ce nam drasticno smanjiti slozenost i poterbu za memorijom (to mozemo jer nas ne zanimaju sami zbrojevi nego samo koliko ih je djeljivih sa 10).

imat cemo polje a, od 10 intova. a[n] ce predstavljati broj zbrojeva koji pri djeljenju s 10 daju ostatak n, pa ce a[0] predstavljati broj zbrojeva koji su djeljivi s 10 (ostatak 0).

Na pocetku imamo zbroj od nula clanova, njegov zbroj je 0, pa je a[0] = 1, a ostali su 0 (ako ne zelis brojati taj zbroj, onda na sammom kraju smanjis a[0] za 1). Sad gledamo za prvi broj - mozemo ga pribrojiti svakom dosadasnjem zbroju i tako dobiti nove zbrojeve (ako ti nije jasno o cemuse radi, reci pa cu detaljnije objasniti), i tako za svaki broj. Na kraju je rjesenje a[0]:

 

 

for(int i = 0; i < n; i++)

{

    for(int j = 0; j < 10; j++)

         tmp[j] = a[j] //moramo privremeno spremiti dosadasnje zbrojeve da ne zbrojimo dvaput, sto nam se lako moze dogoditi ako nismo oprezni

      for(int j = 0; j < 10; j++)   {

         a[j + broj[i] % 10] = tmp[[j + broj[i] % 10] + tmp[j];

    }

}

 

Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: Kombinatorika

grgapm možeš li mi molim te pobliže objasniti kako ovakvi programi funkcioniraju

zašto naprimjer prva for petlja ide uzlazno, a druga nekad uzlazna, a nekad silzna?

zašto se uzima a[j+broj[i]] ili a[i+broj[x]]+=a[i]...?

i ako mi možeš molim te napisati cijeli kod koji bi izračunavao jedan od ovih primjera pa da po njemu probam skužit o čemu se točno radi i na na koji način mogu ovo koristiti u sličnim zadacima ili nekim koji traže dinamičko programiranje....

q8200,radeon4870 1gb, 8gb kingmax 1066 intel i ati moj prvi i jedini izbor sve se da kupiti novcem, ali osjećaj gta 4 u najvećim detaljima:neprocjenjivo
15 godina
neaktivan
offline
Kombinatorika

Za onaj zadatak u kojem zbroj mora biti 51 imamo slijedece(varijable i, j, n nisu konzistente s petlhjom koju sam bio napisao):

 

Zadatak rjesavamo dinamicki, to znaci da cemo prvo rjesavati jednostavniji problem, pa cemo polako nadogradivati rjesenje za jednostavniji problem, dok ne dodemo do rjesenja za zadani. U nasem slucaju to znaci da cemo gledati koliko kombinacija zbrojeva postoji za prvih n brojeva, gdje ce n krenuti od 0, i ici do ukupnog broja zadanih brojeva. Vazno je napomenuti da nas ovjde zanima broj kombinacija, a ne koje su to konkretno kombinacije, pa nam je za svaki slijedeci broj bitno samo na koliko se nacina od prethodnih brojeva mogu dobiti svaki zbroj. Takoder je bitno da imamo gornju granicu zbrojeva koji nas zanimaju (moze se i bez, ali se malo komplicira).

Polje a[i] ce nam u svakom koraku oznacavati broj kombinacija (zbrojeva) koje daju zbroj i za prvih n brojeva. Najjednostavniji je slucaj kad nemamo niti jedan broj, tada na jedan nacin mozemo dobiti zbroj 0 (ne uzmemo niti jedan broj, ili uzmemo sve, kako hoces Osmijeh), a niti jedan drugi zbroj naravno ne mozemo dobiti. Povecamo n na 1, i sad promatramo isti problem za samo jedan broj: svakom prethodnom zbroju mozemo ili pribrojiti taj broj ili ne pribrojiti. Unutarnju petlju radimo silazno da bismo izbjegli pribrojavanje istog broja vise puta:

 

Primjer:

Recimo da je prvi broj jednak 3. Tada vidimo da je jedini zbroj koji smo dosad mogli dobiti 0 (jer a[i] = 0 za i != 0), sto znaci da zelimo postaviti a[3] = 1 (nulu smo mogli dobiti na jedan nacin, a 3 niti na jedan - znaci da cemo sada 3 moci dobiti tako da svakom zbroju koji je davao 0 pribrojimo 3 (a[0] nacina), ili da svakom zbroju koji je davao 3 ne pribrojimo 3 (a[3] nacina)). No, u kasnijim koracima mi necemo unaprijed znati koje zbrojeve mozemo postici iz prethodnih zbrojeva, pa cemo na neki nacin morati pregledati polje. Ako bismo krenuli ispocetka dogodilo bi nam se slijedece - vidimo da a[0] = 1, pa postavimo a[3] = 1, no sad kad dodemo do a[3], vidimo da je a[3] = 1 pa postavimo a[6] = 1! Ako krenemo pregledavati poslje od pocetka, dogodit ce nam se da cemo svaki broj pribrojavati vise puta, i dobit cemo broj kombinacija u kojem se svaki broj moze proizvoljan broj puta pojaviti u zbroju. To nije ono sto zelimo - nama se svaki broj moze pojaviti najvise jednom, pa moramo na neki nacin izbjeci to visestruko pribrojavanje. U ovom slucaju je to jednostavno bilo izvesti silaznom petljom, jer se uvijek updateaju a[i] sa vecim indeksom i, pa znamo da nam se nece dogoditi da koristimo vec updateanu verziju zbroja.

 

Ovo je prilicno slicno matematickoj indukciji zapravo - baza su nam vrjiednosti polja a za n = 0, jer je to rjesenje problema sa 0 zadanih brojeva. Ako imamo rjesenje za prvih k brojeva (n = k), tada promotrimo k+1-vi broj:

Svakom prethodnom zbroju mozemo ili pribrojiti nas novi broj (broj[k + 1]) ili ne pribrojiti. To znaci da cemo zbroj jednak i + broj[k + 1] moci dobiti na a[i] nacina jer smo na toliko nacina mogli od prethodnih k brojeva dobiti i, i sad svakom od tih zbrojeva dodamo broj[k + 1] plusa[j + broj[k + 1]] jer smo na toliko nacina od prethodnih k brojeva mogli dobiti zbroj i + broj[k + 1], i sad niti jednom od njih ne dodamo broj[k + 1]. Novo dobiveno polje a nam upravo opisuje na koliko nacina mozemo dobiti svaki od zbrojeva izmedu 0 i 51 od prvih k+1 brojeva.

 

Kada navedeni postupak prodemo za sve zadane brojeve, dobit cemo broj kombinacija za svaki od zbrojeva izmedu 0 i 51, a ono sto nas zanima u zadatku je upravo a[51], pa je to i rjesenje.

 

 

 

 

Razlika u ovom drugom zadatku je u tome da nam silazna petlja ne bi pomogla u izbjegavanju redundancije, tj svejedno bismo neke brojeve vise puta pribrojili zato sto ostaci pri dijeljenju s 10 idu u krug (nakon 9 slijedi 0) za razliku od zbrojeva koji stalno rastu. Zato koristimo pomocno privremeno polje tmp u koje pospremimo vrijednosti od a da budemo sigurni da pravilno updateamo svaki a u petlji.

Takoder, ovdje nas samo zanima broj kombinacija kojima dobivamo zbrojeve djeljive s 10, a kako zbrajanje "cuva ostatak", nisu nam ni bitni konkretni zbrojevi nego samo broj nacina na koji mozemo dobiti pojedine ostatke.

 

Opet krecemo s a[0] = 1, ako ne uzmemo niti jedan broj, njihov zbroj je 0 sto je djeljivo s 10, i slicno kao u proslom gledamo:

Ostatak (i + broj[k+1]) % 10 mozemo dobiti na toliko nacina na koliko smo mogli dobiti iz prvih k brojeva (tmp[(i + broj[k+1]) % 10]) kojima ne dodamo broj[k+1] plus broj nacina na koji mozemo dobiti zbroj ciji je ostatak i kojima dodamo broj[k+1].

 

 

 

Ako ti nije sasvim jasno jos uvijek, probaj slijediti algoritam rucno s nekim brojevima pa ces valjda skuziti Belji se  Ako imas jos kakvih pitanja samo naprijed, bas mi ubijas monotoniju na poslu Nevinašce

 

Evo ti neki kod recimo za ovaj prvi u c++, konzistentan s varijablama u opisu gore:

 

#include<iostream>

using namespace std;

 

void main() {

   int uk; //broj elemenata

   int a[52] = 0; //broj kombinacija za pojedini ostatak

   a[0] = 1;

 

   cin >> uk;

 

   int broj[uk]; //zadani brojevi, valjda ovo radi (nisam se neko vrijeme sluzio c++ pa sam zaboravio jel se moze ovo, ako ne radi, uvijek mozes koristiti vector ili malloc)

 

   for(int i = 0; i < uk; i++) cin >> broj[i];

 

   for(n = 0; n < uk, n++){ //rjesavamo problem broj po broj

      for(i = 51; i >= 0; i--){ //provjeravamo za svaki broj sve prethodne zbrojeve

         if (broj[n] + i < 52) //zanimaju nas samo zbrojevi manji od 52

            a[broj[n] + i] += a[i]; //svakom zbroju koji daje i mozemo dodati novi broj, a svakom koji daje broj[n] + i mozemo ne dodati novi broj, pa je ovo ukupan broj kombinacija

      }

   }

   cout << a[51]; //ispisujemo broj kombinacija kojima dobivamo zbroj 51

   return 0;

}

 

 

Poruka je uređivana zadnji put pet 9.7.2010 15:38 (Grgapm).
Moj PC  
0 0 hvala 1
16 godina
neaktivan
offline
RE: Kombinatorika

program koji izračunava na koliko se sve načina može dobiti broj (uk) koji želimo , a da pritom unesemo onoliko brojeva koliko smo prije toga odredili(k)...

neka me netko ispravi ako sam nešto pogrešno napisao ili rekao,ili ako se program može poboljšati

 

#include<iostream>

using namespace std;

 

int main() { 

   int uk; //broj elemenata

   long  a[100000] = {0}; //broj kombinacija za pojedini ostatak

   a[0] = 1;
   int k;    //dužina niza koji želimo unjeti
 
   cin>>k;  
   cin >> uk;

 

   int broj[uk]; //zadani brojevi, valjda ovo radi (nisam se neko vrijeme sluzio c++ pa sam zaboravio jel se moze ovo, ako ne radi, uvijek mozes koristiti vector ili malloc)

 

   for(int i = 0; i < k; i++) cin>>broj[i];//unos brojeva kojima želimo računati

 

   for(int n = 0; n < uk; n++){ //rjesavamo problem broj po broj

      for(int i = 0; i <= uk-1; i++){ //provjeravamo za svaki broj sve prethodne zbrojeve

         if (broj[n] + i <= uk) //zanimaju nas samo zbrojevi manji od 52

            a[broj[n] + i] += a[i]; //svakom zbroju koji daje i mozemo dodati novi broj, a svakom koji daje broj[n] + i mozemo ne dodati novi broj, pa je ovo ukupan broj kombinacija

      }

   }

   cout << a[uk]; //ispisujemo broj kombinacija kojima dobivamo zbroj 51
  
   system("PAUSE");
   return 0;

}

q8200,radeon4870 1gb, 8gb kingmax 1066 intel i ati moj prvi i jedini izbor sve se da kupiti novcem, ali osjećaj gta 4 u najvećim detaljima:neprocjenjivo
Poruka je uređivana zadnji put pet 9.7.2010 15:01 (pfliper).
15 godina
neaktivan
offline
Kombinatorika

Vanjska petlja ti mora ici za n < k, unutarnja petlja mora ici unazad, osim ako zelis da se svaki broj moze vise puta pribrojiti, ostalo izgleda ok na prvi pogled (osim sto ne radi za uk > 100000)

Poruka je uređivana zadnji put pet 9.7.2010 15:42 (Grgapm).
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: Kombinatorika

cilj i je da svaki broj pribroji nekoliko puta jer je zanimalo koliko različitih kombinacija daje jedan te isti zbroj

da je druga petlja silazno onda bi naprimjer kombinacija 3+1+1 otpala , a rezultat je isti kao i 3+2

a za ograničenje niza nisam pazio... ali i to se lako može tiješiti da se umjesto 100000 ubaci suma koju pokušavamo dobiti

q8200,radeon4870 1gb, 8gb kingmax 1066 intel i ati moj prvi i jedini izbor sve se da kupiti novcem, ali osjećaj gta 4 u najvećim detaljima:neprocjenjivo
15 godina
neaktivan
offline
RE: Kombinatorika
Onda je dobro, osim te vanjske petlje. Ma ovo sam cisto spomenuo za svaki slucaj, da ne bi bilo nisam znao :P
Mozes polje a dinamicki alocirati nakon unosa ciljanog zbroja pa neces imati taj problem,osim za suludi ciljani zbroj od npr. 10 000 000 000 jer neces imati dovoljno memorije za tako nesto. No, s druge strane, ako trazis toliki zbroj, a imas neki suvisao broj brojeva u zadanom nizu (10 000+), onda ionako ne mozes rijesiti problem u normalnom vremenu pa to nije ni bitno.

BTW, koji si razred i skola? Jesi li vec isao na natjecanja?
16 godina
neaktivan
offline
RE: Kombinatorika

završi sam 2. razred matematičke gimnazije

ove godine sam tek krenio programirati(napočetku malo u školi(pascal)) a sad preko ljeta hvala Bogu imam vremena pa reko da naučim malo bolje(c++)

bio sam na honi-u u prosjeku 1-2 zadatka riješeno(za početak dovoljno)

 

q8200,radeon4870 1gb, 8gb kingmax 1066 intel i ati moj prvi i jedini izbor sve se da kupiti novcem, ali osjećaj gta 4 u najvećim detaljima:neprocjenjivo
15 godina
neaktivan
offline
Kombinatorika

Ma nije ni Pascal za bacit, ja sam cijelu srednju radio u Pascalu i nis mi nije falilo. Doduse, prelazak na C++ definitivno ima svojih prednosti, pa podrzavam Osmijeh

Ovi zadaci su super, i predlazem ti da ih sve pokusas rijesiti, ako ces imati problema prilikom rjesavanja, slobodno pitaj ovdje

Moj PC  
0 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice