Как найти, какие элементы находятся в пакете, используя алгоритм Knapsack [а не только значение пакета]?

Там у меня есть код, который вычисляет оптимальное значение по алгоритму knapsack (NP-жесткая задача bin pack):

int Knapsack::knapsack(std::vector<Item>& items, int W)
{
    size_t n = items.size();
    std::vector<std::vector<int> > dp(W + 1, std::vector<int>(n + 1, 0));
    for (size_t j = 1; j <= n; j++)
    {
        for ( int w = 1; w <= W; w++)
        {
            if (items[j-1].getWeight() <= w)
            {
                dp[w][j] = std::max(dp[w][j-1], dp[w - items[j-1].getWeight()][j-1] + items[j-1].getWeight());
            }
            else
            {
                dp[w][j] = dp[w][j - 1];
            }
        }
    }
    return dp[W][n];
}

Также мне нужно, чтобы были показаны элементы, включенные в пакет. Я хочу создать массив, поместить туда добавленные элементы. Итак, вопрос в том, на каком шаге поставить это добавление, или, может быть, есть другой более эффективный способ сделать это?

Вопрос: Я хочу иметь возможность знать элементы, которые дают мне оптимальное решение, а не только значение наилучшего решения.

PS. Извините за мой английский, это не мой родной язык.

18
задан Greg Hewgill 20 September 2012 в 05:21
поделиться