动态规规转移方程合集-背包问题-(未完)
作者:
白墙
,
2021-08-02 21:21:36
,
所有人可见
,
阅读 315
01背包(每个物品只能至多一次)
f[i][j]表示在前i个物品中选择总体积超过j的最大价值
划分依据:最后一个物品选或者不选----------------------01背包划分
f[i][j] = max (f[i][j], f[i - 1][j - v] + w)
初态:f[0][0] = 0;
目标:f[n][m]
空间优化:f[j] = max{f[j - v] + w};然后体积从大到小循环(因为每一次用到上一层)
完全背包:
f[i][j]参考01背包,但是选择每件物品的次数不受限制
划分依据:01背包划分,但是这里的选有物品数量的区别
初态:f[0][0] = 0;
f[i][j] = max (f[i][j], f[i][j - v] + w)
目标:参考01背包
空间优化:参考01背包.但是体积是从小到大循环,因为每一次是用到同一层的背包
多重背包问题:
f[i] = max (f[j - cnt * v ] + cnt * w) 优化后 f[u + p * v] = max {f[u + k * v] + (p - k) * w};
优化思路:二进制化优化成101背包问题、单调队列优化
多重背包问题:
f[i][j] 表示在前i组选择体积不超过j的最大价值
f[i][j] = max (f[i - 1[j], f[i - 1][j - v[i][k]] + w[i][k]);
初始化:对于二维的,注意在枚举组内的循环外进行初始化
空间优化:类似于01背包
423. 采药
时间是v,价值是w, 总时间是m,数量是n,每一株草采了就没了。所以是01背包问题。
f[i][j]表示在前i株草中采摘时间不超过j的最大价值
1024. 装箱问题
01背包。将问题转换为选择总体积尽量多的问题
f[j] |= f[j - v]
1022. 宠物小精灵之收服(二维01背包)
f[n][i][j]表示在前n个选择消耗体力不超过i,消耗精灵球数量不超过j的最大捕捉数
注意这题体力值必须大于0,也就是说消耗体力不超过总体力- 1
划分依据:根据最后一个背包选还是不选
f[n][i][j] = {f[n][i - energy][j - cnt]};
278. 数字组合(01背包方案数)
类似于最大容量的问题,只不过把bool改成int了
初始状态f[0] = 1;
AcWing 1023. 买书 (完全背包方案数问题)
f[j]表示前j个前i本书中选择总价格不超j的最大方案数
初始状态;f[0] = 1;
注意循环从小到大循环
1021. 货币系统(完全背包方案数问题)
初始状态:f[0] = 1;
注意开longlong
532. 货币系统(完全背包问题)
体积为最大面值。无法表示出来的面值就是需要去除掉的
f[i][j]表示前i张面值中(从小到大排序),凑成不大于j的数的方案。
1019. 庆功会(多重背包问题)
f[i][j] = max {f[i - 1][j - k * v] + w}
在前i个物品中买总价格不超过j的最大价值
7. 混合背包问题
多重背包问题和01背包在一起处理。完全背包单独处理。
8. 二维费用的背包问题(参考宠物精灵)
f[i][j][k]表示在前i件物品中选择体积不超过j,质量不超过k的最大价值。可以省略掉一维,并把第二、第三维的大小从大到小枚举
1020. 潜水员
f[i][j]表示氧气至少为i,氮气至少为j的最小价值。注意这里循环和01背包不一样。
for (int i = m; i >= 0; i --) 需要取到0,因为表示的是至少。就意味着大于i的也能装