具有 2 个属性的背包算法。如何在 3d 数组中实现它?

Posted

技术标签:

【中文标题】具有 2 个属性的背包算法。如何在 3d 数组中实现它?【英文标题】:Knapsack algorithm with 2 properties. How to implement that in a 3d array? 【发布时间】:2012-11-18 22:44:36 【问题描述】:

当有超过 1 个属性时,我无法理解背包问题。 当有 1 个属性时,

我必须编写一个使用具有 2 个属性的背包算法的程序。老师告诉我们,它必须在一个 3d 数组中完成。错误的实现将导致 O(2^n) 处理时间。我无法想象这样的数组会是什么样子。

假设这是我的输入:

4 3 4 // number of records below, 1st property of backpack, 2nd property  of backpack
1 1 1 // 1st property, 2nd property, cost
1 2 2 // 1st property, 2nd property, cost
2 3 3 // 1st property, 2nd property, cost
3 4 5 // 1st property, 2nd property, cost

输出看起来像这样:

4    // the cheapest sum of costs of 2 records
1 3  // numbers of these 2 records

输出说明: 2 组记录适合第一行输入:

(1) - 记录号 1 和记录号 3

  1 1 1
+ 2 3 3
-------
  3 4 4

(2) - 记录号 4

  3 4 5

因为第一组记录是最便宜的(4

但现在,我只需要了解 3d 数组会是什么样子。你们中的一些人能帮我解决这个问题,并一层一层地展示,就像我的形象一样,这会是什么样子? 谢谢。

【问题讨论】:

你的问题很模糊。 “看起来”是什么意思?你的意思是视觉表现吗?您是指模拟 3d 数组的代码吗? 抱歉。我提到视觉表示。一旦我了解它是如何工作的,我会自己实现它。 请为更简单的问题发布一些代码(带有 1 个属性)。还有,第一张图中数组里面的数字代表什么? 重复***.com/questions/13449069/… 【参考方案1】:

从用动态规划求解一约束背包问题的算法转换为求解二约束问题是很容易的。对于有人绘制 3d 图像来向您展示那里正在发生的事情,我想这有点困难。另一方面,该算法非常简单:

我假设您想要一个精确匹配的解决方案,并且您想要最小化成本,而不是最大化价值(我从您的示例中得出)。我之前没有做过这两种变体,所以我不能保证没有错误。

1-约束

1-约束背包问题的矩阵是(item x weight)存储每个位置的值。

算法基本上是:

// WL = backpack weight limit
A[0, 0] = 0
for w = 1, 2, ..., WL // weight
  A[0, w] = INFINITY
for i = 1, 2, ..., n // items
  for w = 0, 1, ..., WL // weight
    // wi and ci are the weight and cost of the item respectively
    // A[i-1, w-wi] + ci = 0 when wi > w
    A[i, w] = min(A[i-1, w], A[i-1, w-wi] + ci)

2-约束

现在将其扩展到包含另一个约束只是:(假设size 是另一个约束)

矩阵将是(item x weight x size)

// WL = backpack weight limit
// SL = backpack size limit
for w = 0, 1, ..., WL // weight
  for s = 0, 1, ..., SL // size
    A[0, w, s] = INFINITY
A[0, 0, 0] = 0
for i = 1, 2, ..., n // items
  for w = 0, 1, ..., WL // weight
    for s = 0, 1, ..., SL // size
      // wi, si and ci are the weight, size and cost of the item respectively
      // A[i-1, w-wi, s-si] + ci = 0 when wi > w or si > s
      A[i, w, s] = min(A[i-1, w, s], A[i-1, w-wi, s-si] + ci)

【讨论】:

如果我们有一个问题,我们对背包中的元素数量有限制。它必须完全等于 k ​​并最大化容量。我假设这种算法可以在这种情况下使用除了最后阶段 A[i, w, s] = max(A[i-1, w, s], A[i-1, w-wi,s] + ci) where s=1 to k .另外如果A[n,WL,k]的值返回无穷大,说明问题没有找到解决办法。你觉得对吗? @SteveIrwin 我可能是错的,但我认为对元素数量的限制需要一个额外的维度(所以你需要一个 4D 数组)。如果您想要更明确的、经过同行评审的答案,或者只是想了解更多信息,您可能需要提出一个单独的问题。【参考方案2】:

你正在尝试做一些不可能的事情——那是你的问题。

当您增加维度数量时,您的项目会获得额外的属性。因此,您可以使用矩形边(prop1 x prop2)或块边 (prop1 x prop2 x prop3),而不是表格的左侧列边(prop1)等等。但是现有的约束,定义表格的上排侧,应该具有相同的维度数。 不仅仅是一维!。因此,您将永远无法将二属性问题放入 3 维块中,而需要 4D 块。 3 个属性的 6D 块等等。

【讨论】:

以上是关于具有 2 个属性的背包算法。如何在 3d 数组中实现它?的主要内容,如果未能解决你的问题,请参考以下文章

具有附加属性的背包算法

如何在一维数组中“扁平化”或“索引” 3D数组?

每日一题--多属性的01背包问题

0/1背包-递归算法

两个包的背包算法

我如何解决 0-1 背包算法的这些变体?