Problem batohu

Programovacie jazyky, rady, poradňa...
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Problem batohu

Príspevok od používateľa marek788 »

Ahoj, potrebujem naprogramovat problem batohu, a chcel by som sa spytat na dve veci. Prva vec, aky datovy typ vyzera byt najvhodnejsi na ukladanie jednotlivych poloziek (programujem v C++)? Druha otazka, robim zatial len brute force, mozno sa budem za to pri citani odpovedi hanbit (myslim si, ze to bude primitivne), ale teraz nejak neviem prist na nejake rozumne riesenie, ako prejst vsetky mozne kombinacie jednotlivych poloziek. Problem mam s tym, ze ak mam napr 5 poloziek, tak potrebujem skontrolovat aj kombinacie po dvoch, ale aj po 3, 4 atd, a to nejak neviem vymysliet. Vedel by mi niekto poradit? Dakujem.
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: Problem batohu

Príspevok od používateľa mirak2 »

uplne primitivne to nie je, problem batohu je np uplny a nejestvuje polynomialny algoritmus, ktory by pre vseobecne zadanie vedel vzdy najst optimalne riesenie. riesenie sa da najst dynamickym programovanim. ak pogooglis problem batohu alebo knapsack problem, tak najdes urcite algoritmus a mozno aj implementaciu v c++
PS: aby si sa vyhol terminologickym fópá... programujes algoritmus, ktory riesi problem, neprogramujes problem :)
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: Problem batohu

Príspevok od používateľa marek788 »

Ahoj, dakujem za odpoved. Ano, dynamickym programovanim to budem riesit neskor, teraz to vsak potrebujem ciste len bruteforcom, a rozmyslam nad tym, ako to napisat tak, aby bola vysledna zlozitost 2^n. Nasiel som par kodov, napr tento https://stackoverflow.com/questions/233 ... rute-force ale nechapem, preco tam pridava do pola A premennu k, ktoru nasledni deli a moduli.
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Re: Problem batohu

Príspevok od používateľa tuti »

Kod 'j' cyklu si mozes predstavit ako binarne pocitadlo, kde pocet bitov sa rovna size. (pocet moznych kombinacii sa rovna 2^size). Vo vysledku sa v A objavi 0 alebo 1, kde 1 znamena ze polozka sa skusi pridat do batoha.

Premenna 'k' funguje ako priznak, ze sa ma v dalsom rade pripocitat 1 (po anglicky carry). Dolezite je si uvedomit ze v A budu len 0 a 1

Kód: Vybrať všetko

A[j] += k;         // ma sa zvysit hodnota na danom rade (ak k == 1 ano, ak k == 0 nie)

k = A[j] / 2;      // ak sa A[j] zvysilo na dva treba spravit prenos do dalsieho radu a zmenit hodnotu v A[j] na 0
A[j] = A[j] % 2;
Napísať odpoveď