Zdravím,
napsal jsem program, který implementuje problém batohu (mám n věcí, které mají své ceny a snažím se dostat do batohu s kapacitou M co nejvíce věcí aby celková cena byla maximální).
Tady je funkce, která zajišťuje kalkulaci hrubou sílou (zkouším veškeré kombinace věcí):
void Knapsack::Calculate(ofstream& fout, int ID, int n, int M, vector<Item>& items){
int max_cost = -1;
int mask, totalweight, totalprize;
bool overloaded;
vector<bool> max_things;
unsigned int iterations = (int)pow(2.0f, n);
for(int i = 1; i < iterations; i++)
{
vector<bool> things;
totalweight = 0;
totalprize = 0;
overloaded = false;
mask = 1;
for(int j = 0; j < n; j++)
{
things.push_back(i & mask);
totalweight += items[j].weight * things[j];
totalprize += items[j].cost * things[j];
if(totalweight > M)
{
overloaded = true;
break;
}
mask <<= 1;
}
if(!overloaded && totalprize > max_cost)
{
reverse(things.begin(), things.end());
max_cost = totalprize;
max_things = things;
}
}
fout << ID << " " << n << " " << max_cost << " ";
vector<bool>::const_iterator it;
for(it = max_things.begin(); it != max_things.end(); it++)
fout << " " << *it;
fout << endl;
}
Ten vnější cyklus představuje projítí všech kombinací, kterých je 2^n. Tzn. minimální (a očekávaná) složitost je 2^n. Uvnitř mám další for cyklus, který proběhne v nejhorším případě n-krát (kontroluju, jestli už jsem nepřekročil kapacitu). V něm sestavuju binární podobu kombinace věcí a sčítám jejich hmotnosti a ceny.
Nedá se to udělat nějak aby celková složitost bylo pouze těch 2^n, prostě to nějak zrychlit?
Dik moc,
H.