首页 > 后端开发 > C++ > 我们如何确定最佳背包解决方案中包含的具体物品?

我们如何确定最佳背包解决方案中包含的具体物品?

Barbara Streisand
发布: 2024-12-02 06:52:11
原创
709 人浏览过

How Can We Identify the Specific Items Included in an Optimal Knapsack Solution?

确定最优背包解决方案中的元素

背包算法是 NP-hard 装箱问题的一种解决方案,可计算最优背包算法从一组容量有限的物品中可以获得的价值。然而,它常常让用户想知道哪些特定项目有助于这个最佳解决方案。

为了解决这个问题,我们可以修改背包算法来跟踪优化过程中选择的元素。这提供了一种直接的方法来识别构成最佳解决方案的项目,而不是仅仅依赖于解决方案的值。

方法:

  1. 创建一个附加的矩阵 selected,其中 selected[w][j] 表示索引 j-1 处的元素是否在容量 w 处被选择。
  2. 初始化选择的矩阵为 0。
  3. 在背包算法中,更新 dp[w][j] 时,如果选择了 items[j-1](dp[ w][j] = dp[w - items[j-1].getWeight()][j-1] items[j-1].getWeight()) 表示该元素已被
  4. 确定最佳值后,追踪所选矩阵以识别所选的特定项目。

伪代码:

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板