您的位置:首页 > 其它

第一篇文章(0/1背包问题探索)

2008-11-11 01:36 197 查看
0/1背包问题是一个经典的动态规划策略的一个实例.基于最近忙于准备软件设计师的考试(结果试题泄露推迟了考试,不知道是福是祸啊!)几乎没有花什么时间研究算法,今晚索性将白天上课没弄懂的0/1背包问题弄个明白!暂且我先用所谓的递归搜索法给出这个问题的一个解决(当然解决的不是很好,而且我还是没弄明白这个递归怎么会是个搜索呢!看来我对递归的了解还是不够深入,应该要从整体上加以把握,再从细节上加以理解!).以下是我的解题过程:
首先我们定义一个函数 int make(int i,int j)用来表示从前i个物体中选择出若干物体放入剩余空间为j的背包得到的最优解(即最大价值),其中i为当前待决定是否要放入背包的物体号,j为当前的剩余空间(注意是物体决定物体i是否放进去前的剩余空间).有此我们可以得到一个递归式:
make(i,j)=max{make(i-1,j-w[i])+v[i],make(i-1,j)} j>=w[i] (1)
make(i,j)=make(i-1,j) j<w[i] (2)
上式说明如下:
对于式子(1)来说:j>=w[i]说明当前物体的体积超过了背包剩余的空间容量,于是我们分两种情况讨论,并取这两种情况所获得的价值最大者作为当前问题的最优解.第一种情况是:由于当前物体的容量大于剩余背包体积,所以物体i不能直接放入背包,而是考虑能否从背包中置换出某一物体,然后再将物体i加入.这种情况从宏观上来理解则是物体i加入了背包,那么前i-1个物体中放入背包的那些物体所占的空间就是j-w[i],且make(i-1,j-w[i])是前i-1个物体的最优解,再加上已经确定放入背包中的物体i,则这种情况得到的解为make(i-1,j-w[i]):第二种情况:是物体i不放入背包中,意思就是前i-1个物体中取出某些物体得到当前解make(i-1,j);
对于式子(2)来说:j<w[i]
`````太晚了,明天还有课,加上自己在这个地方还是有没有弄明白的地方,明天继续写`````
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: