ここに、ナップザック アルゴリズム (ビン パッキング NP 困難問題) を使用して最適値を計算するコードがあります。
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];
}
また、パックに含まれる要素を表示する必要があります。選択した要素を配置する配列を作成したい。問題は、この選択をどのステップで実行できるかということです。どのアイテムが取られたかを判断するための他のより効率的な方法はありますか?
最適解の価値だけでなく、最適解を与えてくれるアイテムを知りたい。