|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 香川群子 于 2017-6-26 09:24 编辑
发现问题了。只要改一下顺序,就完美了。
- Sub dg2(i&, j&, t&) '提取全部满足背包尺寸的最大价值的k个组合解
- Dim i2&, s$, v&, w&
- If DP(i, j) = 0 Then
- jg(0, k) = t
- s = String(m, "0"): w = 0: v = 0
- For i2 = i + 1 To m
- If jg(i2, k) Then jg(i2, k + 1) = 1: Mid(s, i2, 1) = 1: w = w + sj(i2, 1): v = v + sj(i2, 2)
- Next
- 'k = k + 1: dic(s) = k '返回所有可能解
- If w <= h Then If v = DP(m, h) Then k = k + 1: dic(s) = k '舍去部分价值接近最大值的解
- Exit Sub
- End If
-
- If DP(i, j) = DP(i - 1, j) Then Call dg2(i - 1, j, t) '当前物品不可放入时(放入会超过背包尺寸)
- If j >= sj(i, 1) Then '确保是可放入背包尺寸的物品
- If DP(i, j) >= sj(i, 2) Then '价值可扣除时
- If DP(i, j) - sj(i, 2) = DP(i - 1, j - sj(i, 1)) Then '当前价值扣除价值=未放入背包时的价值
- jg(i, k) = 1: Call dg2(i - 1, j - sj(i, 1), t + 1): jg(i, k) = 0 '本物品记录在组合内
- Else
- If DP(i, j) - sj(i, 2) = DP(i, j - sj(i, 1)) Then Call dg2(i, j - 1, t) '不含当前物品时
- End If
- End If
- End If
- End Sub
复制代码
把当前物品不可放入这一句放到最前面,就对了。
现在的递归过程,和生成DP表过程的做法正好是相反的,所以就对了。
|
评分
-
2
查看全部评分
-
|