确定最优背包解决方案中的元素
背包算法是 NP-hard 装箱问题的一种解决方案,可计算最优背包算法从一组容量有限的物品中可以获得的价值。然而,它常常让用户想知道哪些特定项目有助于这个最佳解决方案。
为了解决这个问题,我们可以修改背包算法来跟踪优化过程中选择的元素。这提供了一种直接的方法来识别构成最佳解决方案的项目,而不是仅仅依赖于解决方案的值。
方法:
伪代码:
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)); std::vector<std::vector<int>> selected(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()); selected[w][j] = (dp[w][j] != dp[w][j-1]); } else { dp[w][j] = dp[w][j - 1]; } } } // Identify selected items std::vector<int> takenItems; int line = W; int i = n; while (i > 0) { if (selected[line][i]) { takenItems.push_back(items[i-1].getIndex()); // Index of item taken line -= items[i-1].getWeight(); } i--; } return dp[W][n]; }
这种增强的背包算法不仅可以识别最佳值,还可以识别有助于该最佳值的特定元素解决方案。
以上是我们如何确定最佳背包解决方案中包含的具体物品?的详细内容。更多信息请关注PHP中文网其他相关文章!