多重背包的两种做法

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

posted @ 2015-10-04 09:24  HELLO----WORLD  阅读(257)  评论(0编辑  收藏  举报