递归背包变体的优化

时间:2016-04-17 09:26:28

标签: c++ recursion knapsack-problem

我有N个不同的项目,整数重量和一个重量容量为K的包。

在' normal'背包问题项目也有一个值,目标是找到可以带走的项目的最大值。相反,我想找到可以携带的事物的可能组合的数量。

我的代码产生正确的输出,但效率非常低(例如,有25个项目可以同时放入包中,有33,554,432个函数调用)。有没有办法让这个过程更快?

void possibleSets(vector<int> items, int capacity, long int &count)
{   
    // Look at the first item in the list
    int currentItem = items.at(0);

    // If that first item in the list could fit in your bag then +1 count
    if (capacity - currentItem > -1){
        count++;
    }

    if (items.size() == 1){ // No more combinations left to try
        return; 
    }
    else {
        items.erase(items.begin());

        // Recursive call 1:
        // Ignore that first item, and try the rest of the list
        possibleSets(items, capacity, count); 

        // Recursive call 2:
        // Put that first item in your bag, then try the rest of the list
        capacity -= currentItem;
        if (capacity > -1){
            possibleSets(items, capacity, count);
        }

    }
}

0 个答案:

没有答案