问题
有 n 种物品,其中第 i 种物品的体积为v[i],价值为w[i],并且有c[i]个,
有一个容积为 m 的背包,选若干个物品装入背包,求解将哪些物品装入背包
可使这些物品的总体 积不超过背包容量,且价值总和最大。
时间复杂度
n
O( ∑ log( c[i] ) * m )
i = 1
思路
把每种物品用二进制拆分成独立的几个物品再转化成01背包
code
for( int i = 1; i <= n; i++ )
{
int num = min( c[i], m / v[i] );
for( int k = 1; num > 0; k <<= 1 )
{
if( k > num )
k = num;
num -= k;
for( int j = m; j >= v[i] * k; j-- )
f[j] = max( f[j], f[j - v[i] * k] + w[i] * k );//都要*k
}
}



京公网安备 11010502036488号