关于01背包的尖锐的疑问?

CSharp_XinBing 2009-05-17 06:08:57
动态规划方法解空间好像是以物品数(N)为横坐标, 以背包容量(M)为纵坐标形成的二维数组. 那么二维数组大小为M*N, 不知道对与不对?
如果是二叉树(决策树)的话, 解空间就是二叉树了, 节点数为2^N.
好像大家都以此为依据说, 动态规划方法比二叉树回溯方法好. 但我觉得如果是二叉树的话, 其实节点并不是2^N, 而是二叉树与M*N二维数组的交集, 即二叉树把背包容量超过M的节点都剪枝了. 如果是这样的话, 那其实二叉树的节点数要比M*N的大小要小的多. 因为M*N中有许多并不存在的节点了. 所以我想, 不论是M*N数组或是二叉树的解空间, 只要运用动态规划算法, 效率是差不多的.

另外我想问的一点是动态规划方程f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
在二叉树结构来看, 并不是取二个中的最大值, 正确的说法是取其中合法的一个.
因为, 二叉树中一个子节点只有一个父节点. 而他们的边要么为0(不放入), 要么为1(放入). 不存在一个父节点与一个子节点之间有二个边!
所以公式前面加max有误导之嫌, 应该改为f[i][v]=valid{f[i-1][v],f[i-1][v-c[i]]+w[i]} 不知道我的理解对吗?
...全文
290 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
瓶盒 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 CSharp_XinBing 的回复:]
嘿嘿, 早你怎么不出来啊. 害的我看了几天的网上文章和CSDN论坛帖子, 说的都是一样的, 搞的我头晕脑涨, 竟然没有看明白.
我和你的思路差不多, 我也是先画表格, 再画二叉树(当然我的只有三个物品的, 三个阶段). 最后在…
[/Quote]
呵呵,我也是看了两天网上文章才理出个头绪。
今天,实测了一下大数据的情况,发现我8楼的说法是有问题的,当节点深度上千后,如果包容量远小2^n,比如为
10000,这时前一种方法要快得多。估计这时,递归对访问过的节点虽然不再访问它的子节点,但是这样
重复访问到的父节点数量也过大了。
CSharp_XinBing 2009-05-19
  • 打赏
  • 举报
回复
总的来说, 我感觉很多朋友学习算法时都是人云亦云, 没有自己的想法. 从网上的文章和帖子的内容都一样就能看不出这一点来. 没有自己的想法, 没有新意, 都是一样的. 这样对于自己学习算法我认为是不太好的, 不知道我说的对不对啊.
CSharp_XinBing 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bottlebox 的回复:]
参照对比下两个图表:https://sites.google.com/site/bottlehe/01bei-bao-dong-tai-gui-hua-liang-zhong-jie-jue-fang-an-de-bi-jiao
可以得出结论递归方式是更有效率的方式。
[/Quote]
嘿嘿, 早你怎么不出来啊. 害的我看了几天的网上文章和CSDN论坛帖子, 说的都是一样的, 搞的我头晕脑涨, 竟然没有看明白.
我和你的思路差不多, 我也是先画表格, 再画二叉树(当然我的只有三个物品的, 三个阶段). 最后在表格里连出二叉树, 才搞明白到底是怎么回事! 但是毕竟是只有三个阶段, 所以不敢确定到底阶段多了会出现什么其它的情况. 这才上来问一问. 如果BAIDU能搜索到你这样的好文章也不用我自己浪费时间了.
其实说白了, 所谓的表格就是将二叉树中同一个层次(阶段)的所有节点, 按容量大小重新排序而已! 而这个表格像是一个剪切框一样, 把伸展出去的二叉树进行了剪枝.
  • 打赏
  • 举报
回复
不错,收藏先。
iwantnon 2009-05-18
  • 打赏
  • 举报
回复
就一个问题而言,分支列举(即决策树)是最根本的解法,其它一切方法都只不过是在此基础上的优化,例如动态规划,就是将决策树中相同的状态节点作了一下合并--当多个相同状态节点代价值不同时,合并后的代价值取最优的那一个,这也就是bellman方程中为什么会出现max或min的原因。楼主所谓的“用二维数组”和“用树”其实没有本质区别,其实都是用树表示,因为二维数和是树,一维数组也是树。
另外,对于一个问题,构造决策树的方法是非常多的,因此对应的动态规划解法也很多,因此bellman方程作为决策树(或者动态规划方式)的数学表示,也是非常多的。树主例举的f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}只不过是其中一种(未必是最自然的一种)。
我的个人的看法是,bellman方程只是从形式上看挺不错,但价值却很低,因为多数问题用动态规划来解显得非常自然,但是却无法写出bellman方程,换句话说,bellman方程是对动态规划的一个束缚,如果抛弃bellman方程,动态规划可以解决更多的问题。只不过有时候我们为了表达起来省事儿,又恰巧问题的bellman方程很容易写,就写一下它,但实际上没有价值。
iwantnon 2009-05-18
  • 打赏
  • 举报
回复
f[i][v]表示的是已考虑完物件1~i的取舍且剩余容量为v时的最大收益。
二叉决策树中同一层顶点对应的i是相同的。
比较二叉决策树与f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
可以看出后者是对前者相同层上v相同的节点作了合并。
因此后者节点数较少。
绿色夹克衫 2009-05-18
  • 打赏
  • 举报
回复
感觉还是不太一样,比如10个数都存在选与不选2个状态,在这1024个状态中,可能有几十个状态的和都会对应同一个数值,
使用dp的话,对这几十个数只要计算1次即可,但对于树结构,却可能同时对应着几十个节点,这些节点都不会因为剪枝而被删掉.
瓶盒 2009-05-18
  • 打赏
  • 举报
回复
参照对比下两个图表:https://sites.google.com/site/bottlehe/01bei-bao-dong-tai-gui-hua-liang-zhong-jie-jue-fang-an-de-bi-jiao
可以得出结论递归方式是更有效率的方式。
CSharp_XinBing 2009-05-18
  • 打赏
  • 举报
回复
对二叉树结构来说仍是取最大值,每个父结点下面总是有两个子结点,因而是有两条边的,一条为0(不放入),
一条为1(放入).二叉树遍历的结果就是要选择出其中的一条。
=========================================================
嘿嘿, 我总结动态规划的实质就是: 对于每一个阶段, 求出此阶段中所有节点的值(依据上一个阶段节点). 不知道对与不对, 如果对的话, 那动态规划的话, 就要求出二个子节点的值, 因为它们是属于同一阶段的(按物品编号划分阶段).
-------------------
另外, 方程中是根据I-1阶段中的父节点去求I阶段中的子节点. 而从子节点到父节点只是一对一, 一条边的关系. 没有第二种选择的, 所以不是求最大, 而是选择"合法"的一个式子来求值. 不知道对与不对.
瓶盒 2009-05-18
  • 打赏
  • 举报
回复
这两天也在看这一问题。谈下我的收获。
对01背包问题,二叉树回溯方法是标准方法,只要剪枝方式得当,基本上能达到M*N二维数组遍历的效率。
M*N二维数组遍历的解决方式是有局限性,对M过大,N较小的实例效率较差。另外如果物体重量为小数的情况处理也较麻烦,应该需要转成整数才能处理。

另外我想问的一点是动态规划方程f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
在二叉树结构来看, 并不是取二个中的最大值, 正确的说法是取其中合法的一个.
------------------------------------------------------------------------
对二叉树结构来说仍是取最大值,每个父结点下面总是有两个子结点,因而是有两条边的,一条为0(不放入),
一条为1(放入).二叉树遍历的结果就是要选择出其中的一条。
dhc_fy 2009-05-17
  • 打赏
  • 举报
回复
动态规划方法解空间好像是以物品数(N)为横坐标, 以背包容量(M)为纵坐标形成的二维数组. 那么二维数组大小为M*N, 不知道对与不对?

觉得不能这么说,M*N只是在使用备忘录方法时,通过中间过程,省去了很多重复计算得到的解空间。
CSharp_XinBing 2009-05-17
  • 打赏
  • 举报
回复
另外哪里有01背包的类似于POJ的判卷系统, 特别是还有01背包的测试数据? 我想用测试数据来检测一样, 最好是N(物品数)特别大的.
2011年是IBM成立壹百年,也是IBM Rational开发者大会规模最大的壹年,12个分会场,一百多位来自国内外的技术专家汇聚一堂。这是我们相聚、学习、交流的一个非常好的机会。 独乐乐不如众乐乐,SCMLife鼓励大家呼朋唤友来同参会,和朋友一起参会的同时,您还有可能获得: 奖励1、邀请10人注册参会(除自己参会外),可获得IBM便携包一个,可累积,如邀请20人,则可获得2个IBM便携包,会场当天去SCMLife展台领取。 奖励2、邀请3人注册参会(除自己参会外),可获得IBM Rational考试券会前测评一次。可累积,如邀请6人,则可获得2次测评机会。以此类推。拥有更多测评机会,就意味着您有更多拿到免费考试券的机会。 测评通过后,您将获得价值900元的免费考试券一张。凭免费考试券在大会当天去参加热考,通过后即可获得IBM Rational国际认证,为您的职场生涯增色。 特别注意: 1、每家公司的参会人数不得多于5人。 2、奖励1和奖励2可同时参加。假如您邀请了13人注册参会,可获得IBM便携包1个,1次测评机会。 3、非SCMLife注册参会人员,仅有1次测评机会。 4、您可以邀请朋友或同事在(http://www.scmlife.com/product/IBM/RSDC2011/reg.html)注册后,将他们的姓名及公司名发送邮件到:scmlife@gmail.com,如需参加测评,请将您需要参加认证的科目代号一起发邮件,科目代码参见下面可参加的考试科目一览表,我们会给你安排后续测评和发送礼品事宜。 5、免费考试券共计100张,每人仅限1张。先到先得,发完即止。 6、无论是通过哪种渠道注册参会,均必须通过SCMLife的测评才可以获得免费考试券。 相关会议信息: 本次大会的亮点:http://www.scmlife.com/product/IBM/RSDC2011/index.html 8月26日 北京大会议程:http://www.scmlife.com/product/IBM/RSDC2011/agenda.html 8月30日 上海大会议程:http://www.scmlife.com/product/IBM/RSDC2011/agenda2.html 快速注册参会:http://www.scmlife.com/product/IBM/RSDC2011/reg.html 可参加的考试科目一览表: 如果您还有任何疑问,直接恢复本邮件或致电:13581809377 咨询。期待大家相聚在IBM Rational开发者大会 SCMLife 展台前。 附IBM便携包图片及介绍: 可折叠双肩背包。超轻防水面料,可调节肩带设计。可将这个体积较大的背包经折叠压缩后巧妙收入位于背包下部的小包中。便于携带,商旅出差的好伴侣。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧