ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: jsgj2023

[求助] 背包问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-6-22 07:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 paciguard 于 2017-6-22 08:01 编辑

为什么两个工具的结果不一样:

2017_06_22_07_53_59_Microsoft_Excel_DP_01背包01.jpg
2017_06_22_07_54_48_Microsoft_Excel_DP_01背包.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-22 08:23 | 显示全部楼层
paciguard 发表于 2017-6-22 07:57
为什么两个工具的结果不一样:

你得比较一下看看哪个结果更优!

TA的精华主题

TA的得分主题

发表于 2017-6-22 08:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jsgj2023 发表于 2017-6-22 08:23
你得比较一下看看哪个结果更优!

是的,但我觉得背包问题首先是一个数学问题,没有计算机就解决不了吗?所以方法比代码重要。。。

TA的精华主题

TA的得分主题

发表于 2017-6-23 22:12 | 显示全部楼层
看懂了,写了个递归过程,可以把所有组合都提取出来。

DP_02背包.zip

39.51 KB, 下载次数: 32

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-6-23 22:42 | 显示全部楼层
'下面代码随机选取1种组合
    i = m: j = h
    Randomize
    Do
        t = j
        Do
            If DP(i, j) = DP(i, j - 1) Then j = j - 1 Else Exit Do
        Loop Until j = 0
        j = j + Int(Rnd * (t - j + 1))

        t = i
        Do
            If DP(i, j) = DP(i - 1, j) Then i = i - 1 Else Exit Do
        Loop Until i = 1
        i = i + Int(Rnd * (t - i + 1))

        jg(1, 0) = jg(1, 0) + 1: jg(1, i) = 1: j = j - sj(i, 1)
        i = i - 1
    Loop Until DP(i, j) = 0

TA的精华主题

TA的得分主题

发表于 2017-6-23 22:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
paciguard 发表于 2017-6-22 08:32
是的,但我觉得背包问题首先是一个数学问题,没有计算机就解决不了吗?所以方法比代码重要。。。

这个是什么

TA的精华主题

TA的得分主题

发表于 2017-6-24 23:07 | 显示全部楼层
香川群子 发表于 2017-6-23 22:12
看懂了,写了个递归过程,可以把所有组合都提取出来。

你附件中的dg_1过程是什么意思?是为了统计解的数量吗?
当数据量稍大(例如物品数量=100)时,进入该过程就出不来了(递归组合爆炸了)。

这几天我也一直在琢磨如何有效的从DP表中提取出所有的可行解,这是个挺绕人的问题。
我附件中的代码能从DP表中提取多组解,但是否能全部提取,现在还搞不清楚。------------------------------------------
DP_01背包v1.rar (726.72 KB, 下载次数: 37)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-6-25 22:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
标记一下,好好向大师们学习

TA的精华主题

TA的得分主题

发表于 2017-6-25 23:29 | 显示全部楼层
提取解的能力有所提高,但似乎仍有遗漏。

DP_01背包v2.zip

157.76 KB, 下载次数: 28

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-6-26 09:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 香川群子 于 2017-6-26 09:24 编辑

发现问题了。只要改一下顺序,就完美了。

  1. Sub dg2(i&, j&, t&) '提取全部满足背包尺寸的最大价值的k个组合解
  2.     Dim i2&, s$, v&, w&
  3.     If DP(i, j) = 0 Then
  4.         jg(0, k) = t
  5.         s = String(m, "0"): w = 0: v = 0
  6.         For i2 = i + 1 To m
  7.             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)
  8.         Next
  9.         'k = k + 1: dic(s) = k '返回所有可能解
  10.         If w <= h Then If v = DP(m, h) Then k = k + 1: dic(s) = k '舍去部分价值接近最大值的解
  11.         Exit Sub
  12.     End If
  13.    
  14.     If DP(i, j) = DP(i - 1, j) Then Call dg2(i - 1, j, t) '当前物品不可放入时(放入会超过背包尺寸)
  15.     If j >= sj(i, 1) Then '确保是可放入背包尺寸的物品
  16.         If DP(i, j) >= sj(i, 2) Then '价值可扣除时
  17.             If DP(i, j) - sj(i, 2) = DP(i - 1, j - sj(i, 1)) Then '当前价值扣除价值=未放入背包时的价值
  18.                 jg(i, k) = 1: Call dg2(i - 1, j - sj(i, 1), t + 1): jg(i, k) = 0 '本物品记录在组合内
  19.             Else
  20.                 If DP(i, j) - sj(i, 2) = DP(i, j - sj(i, 1)) Then Call dg2(i, j - 1, t) '不含当前物品时
  21.             End If
  22.         End If
  23.     End If
  24. End Sub
复制代码


把当前物品不可放入这一句放到最前面,就对了。

现在的递归过程,和生成DP表过程的做法正好是相反的,所以就对了。

DP_01背包v2.zip

63.42 KB, 下载次数: 57

评分

2

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-28 04:45 , Processed in 0.056514 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表