zoukankan      html  css  js  c++  java
  • 多重背包的两种做法

    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背包做一遍就行了

  • 相关阅读:
    寒假作业1
    秋季学习总结
    记叙在人生路上对你影响最大的三位老师
    2019年春季学期第二周作业
    币值转换
    第九周作业
    第八周作业
    第七周作业
    第六周作业
    第五周作业
  • 原文地址:https://www.cnblogs.com/helloworld-c/p/4854146.html
Copyright © 2011-2022 走看看