0-1背包
1)如果数据量不大可以考虑用二维,求出找到第i个物品时的所有价 值量
2)用一维只能保证保留找到第i个物品时的最大价值量
3)若是背包变形,某个固定因子有系数与之发生关系,则应先把关系 确定最优再用背包zoj3689
4)初始化,若要求装满则除0初始化为0,其余初始化为无穷,若要 求尽可能装满,则全部初始化为0
void zeroOnePack(int cost,int value)
{
for(int i = m; i >= cost; i--)
{
dp[i] = max(dp[i],dp[i-cost]+value);
}
}
完全背包
思维点:因为有无限多,不要求dp[i]一定与dp[i-1]相关
void completePack(int cost,int value)
{
for(int i = cost; i <= m; i++)
{
dp[i] = max(dp[i],dp[i-cost]+value);
}
}
多重背包
方法:
1)二进制优化
void multiPack(int cost, int value, int cnt)
{
if(cnt * cost >= m)
{
completePack(cost,value);
return;
}
else
{
int k = 1;
while(k <= cnt)
{
zeroOnePack(k*cost,k*value);
cnt = cnt - k;
k = 2*k;
}
zeroOnePack(cnt*cost,cnt*value);
}
}
2)单调队列优化
F[i][j] = max { F[i
- 1] [j – k * v[i] ] + k * w[i] } (0 <= k <= m[i])
F[i][j] = max { F[i
- 1] [b + k * d] - k * w[i] } + a * w[i] (a – m[i] <= k <= a)