zoukankan      html  css  js  c++  java
  • 第三讲 多重背包问题(对背包九讲的学习)

    题目

    有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

    基本思路:

    对每个物品都考虑拿几个(这个很好理解)

    递推式:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}

    时间复杂度是O(V*Σn[i])

    转换为为01背包问题:

    这里利用了二进制的性质优化

    时间复杂度:O(V*Σlog n[i])

    例子1:(注意看数字的颜色)

    7个物品i的多重背包问题=01背包问题(物品1=1个物品i,物品2=2个物品i,物品3=4个物品i,,,)

    2^0+2^1+2^2=7  7-7=0,不用补了

    例子2:

    8个物品i的多重背包问题=01背包问题(物品1=1个物品i,物品2=2个物品i,物品3=4个物品i,物品4=1个物品i)//蓝色地方是补到8

    1+2+4=7 < 8    8-7=1,再1

    注意每次选的时候还是要判断是否空间超出了

    例子3:

    5个物品i的多重背包问题=01背包问题(物品1=1个物品i,物品2=2个物品i,物品3=2个物品i)//蓝色地方是补到5

    1+2=3<5  5-3=2,再补个2

    比方说例子3我们看到了,物品1,物品2,物品3可以组合成0~5的任何数

    这样一来,就从多重背包转换成了01背包

     继续优化:

    图片截图自 背包九讲

    最后那个O(Vn)的方法我还没学,先放着,以后其他学完了再学他

  • 相关阅读:
    go语言最新版本 下载地址
    PHP5 各版本维护时间
    springzuul本地路由和跨服务器路由问题
    大数据学习路线(转载)
    springcoud feign超时的问题
    java 桥接模式
    springcloud单个服务内存使用详情
    centos7搭建filebeat
    centos7搭建logstash
    centos7搭建kibana
  • 原文地址:https://www.cnblogs.com/zyacmer/p/10011362.html
Copyright © 2011-2022 走看看