您的位置:首页 > 其它

背包问题

2015-07-22 21:15 225 查看
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) 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: