• 多重背包的两种做法


    dp(i,j)=max(k->ti){dp(i-1,j-k*ci)+k*vi,dp(i,j)};

    前 i 件物品在容量有 j 的最大价值是由

    前i-1件物品容量为 j-k*ci 的容量的最大价值加上 k*vi 的最大值

    k从0循环到ti(ti为物品的数量)

    dp(i,j)要初始化为最小值

    第二种方法

    二进制拆解:

    比如有一个物品有13件

    2的0次方:13-2^0=12

    2的1次方:12-2^1=10

    2的2次方:10-2^2=6

    2的3次方:因为6<8所以直接保留6;

    然后就可以把这13件物品拆解为(2^0),(2^1),(2^2),(6)

    这样1,2,4,6件物品,

    1. 每件物品1个,
    2. 每个物品的代价为原来的代价   *1,*2,*4,*6
    3. 每个物品的价值为原来价值      *1,*2,*4,*6

    这样拆解每个物品可以拆解为log(t)个,最后用01背包做一遍就行了

  • 相关阅读:
    K8S之traefik高级特性
    docker nginx-php容器镜像瘦身优化
    Dubbo-服务消费者初始化
    ThreadLocal 源码分析
    JVM 对象分配规则
    JVM GC 机制
    LockSupport
    自旋锁
    CAS
    Synchronized 监视器锁
  • 原文地址:https://www.cnblogs.com/helloworld-c/p/4854146.html
Copyright © 2020-2023  润新知