【发布时间】:2023-04-03 12:30:01
【问题描述】:
我需要一些帮助,想出一种自下而上的方法来解决类似背包的问题。
问题: 基本上,您有一些项目,每个项目都有一个值和一个重量,并且您想选择总重量最小的项目,但值的总和使您达到提供的某个值。 假设我们有一个包含权重和值的二维数组。 权重和值是非负的。 前任: |索引|重量 |价值观 | |-----| -------- | ------ | |1 | 3 | 15 | |2 | 29 | 5 | |3 | 12 | 1 | |4 | 99 | 2 | |5 | 12 | 9 | |6 | 0 | 40 |
我们也有一个阈值,用于我们需要达到或超过的值(而不是背包中的限制)。
因此,我们希望选择重量最小但使我们达到或超过阈值的项目。 因此,上面示例的阈值是 64。我们可以选择项目 1、2、5、6,它们的权重为 44,值 69 高于阈值。 我希望问题很清楚,如果没有,我可以稍后提供更多示例。 这是我们想要的公式:
到目前为止我的解决方案: 我正在使用自下而上的方法构建动态表。这是我用于构建构建表格的部分的猪图片代码:
// arr: 2D array that holds the weigth and values (starting from index 0)
// Values: the second column of the array
// Weights: the first column of the array
// n = Number of distinct items
// W = the threshold
// m: table that I store the values in
for j from 0 to W do:
m[0, j] := INF
for i from 1 to n do:
for j from 0 to W do:
if arr[i-1,1] > j then:
m[i, j] := m[i-1, j]
else:
m[i, j] := min(m[i-1, j], m[i-1, j-arr[i-1,1]] + arr[i-1,0])
return m[n,W]
基本上,我从阈值中减去该值并找到最小量(即可能达到的最小重量)。 但是,这并没有在很多测试中为我提供正确的表格,我无法弄清楚我哪里出错了。
我有点卡住了,任何正确构建表格的提示或参考将不胜感激。
【问题讨论】:
-
这是正在进行的考试吗?
-
不,它是 CS 项目的一部分。但我不是要代码,我只是要一些命中或我可以阅读的资源。
-
你可以看看en.wikipedia.org/wiki/Change-making_problem。请注意,在提出的问题中,添加一枚硬币的重量始终为 1
标签: algorithm dynamic-programming knapsack-problem