背包问题
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)
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)
相关文章推荐
- NYOJ 236 心急的C小加
- Transportation poj1040
- Android Recovery Ui 分析
- MATLAB 图像函数(第七章) 图像的代数运算
- void 指针 void*
- Openssl rsa命令
- 函数
- Android的生命周期
- 计算化学领域的黑科技
- hdoj-1197-Specialized Four-Digit Numbers
- 杭电OJ-1031_Design T-Shirt
- 计算化学领域的黑科技
- Scala详解---------控制结构和函数
- NYOJ 523 亡命逃窜(3维bfs+队列)
- wampsever自定义站点根目录,多站点配置,自定义端口号
- eclipse 启动后,啥也不干,就一直在loading descriptor for XXX (XXX为工程名),,其他什么操作都不能操作。 如下图所示,保存文件也无法保存。 这个怎么办?一年好几天,什么都干不了!!!!!
- 安装Navicat Premium
- Makefile 选项 CFLAGS 、LDFLAGS 、LIBS
- Java线程(十一):Fork/Join-Java并行计算框架
- C++ 四种强制转换符的区别