背包问题学习总结

      怎么说呢,刚刚写了一大堆,但是没有保存,现在很难受(눈_눈)(눈_눈),下次再也不能用记事本写东西了!天杀的一加!
      好,现在切入正题,背包问题最基本的就是0-1背包。题目描述:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
      利用二维数组f[i][v]来表示放第i件物品在容量为v的背包中的价值。
      状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
      仔细观察不难发现,第i件物品的状态只与第i-1件有关,因此可以将问题优化到一维f[i][v]是由f[i-1][v]和f[i-1] [v-c[i]]两个子问题递推而来,能否保证在推f[i][v]时(也即在第i次主循环中推f[v]时)能够得到f[i-1][v]和f[i-1] [v-c[i]]的值呢?事实上,这要求在每次主循环中我们以v=V..0的顺序推f[v],这样才能保证推f[v]时f[v-c[i]]保存的是状态 f[i-1][v-c[i]]的值。
      伪代码如下:
      for i=1..N 
         for v=V..0    
             f[v]=max{f[v],f[v-c[i]]+w[i]};
    其中v不一定必须以0为结尾,还可以是当前消耗的容量c[v]。       
     另外一个比较基础的背包问题就是完全背包问题,它与0-1背包的唯一不同之处就是物品的选择是没有限制的。         
    如果仍然按照解 01背包时的思路,令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程,像这样:
    f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}                   同样可以优化成一维,
    for i=1..N  
      for v=0..V     
         f[v]=max{f[v],f[v-cost]+weight}   
    v是正序递增的。这刚好可以满足重复选物品的需求,也是区别于0-1背包问题的不同之处。      
    背包问题最大的特点就是可以灵活套用,只需要根据情况增加一些限制,不同的限制就是不同的背包问题,难得是找准对应关系。        
    明天放假了,还是很开心的,虽然刚才一不小心删除了自己辛辛苦苦码好的字,假期没打算放松,既然选择了ACM也就告别了休息,对自己最近几天的学习状态不是很满意,开始浮躁,时间安排也乱七八糟,比如今天就没有做题,很是懊恼。还有就是大学生编程竞赛,自己不敢去参加啊,一是英文水平不行,二是对自己的能力信心不足,离开了网络和老师,自己能否独立面对题目。一直以来都是踩着别人的脚印做题,很多东西不完全属于自己,是选择重在参与还是出则惊人,还在犹豫。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值