多重背包的两种做法
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,*4,*6
- 每个物品的价值为原来价值 *1,*2,*4,*6
这样拆解每个物品可以拆解为log(t)个,最后用01背包做一遍就行了
---QQ:2602626065