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

    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]
`````太晚了,明天还有课,加上自己在这个地方还是有没有弄明白的地方,明天继续写`````
                       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值