蓝桥杯备赛笔记(十) 背包问题

(1)背包模型

有一个体积为V的背包,商店有n个物品,每个物品有一个价值v和体积w,每个物品只能被拿一次,问能够装下物品的最大价值。

这里每一种物品只有两种状态,即“拿”或“不拿”。设状态dp[i] [j]表示到第i个物品为止,拿的物品总体积为j的情况下的最大价值。转移方程为:

dp[i] [j] = max(dp[i - 1] [j],dp[i - 1] [j - w] + v)

如果不拿物品i,那么最大价值就是dp[i - 1] [j],如果拿了就是从体积j - v转移过来,以及会变大w,价值增加v。最后输出dp[n] [V]。

(2)完全背包模型

完全背包也叫无穷背包,即每种物品有无数个的背包。

有一个体积为V的背包,商店有n个物品,每个物品有一个价值v和体积w,每个物品有无限多个,可以被拿无穷次,问能够装下物品的最大价值。

设状态dp[i]表示拿的物品总体积为i的情况下的最大价值。转移方程为:

$dp[i] = max(dp[i],dp[i - w] + v),现在就必须使用“新数据”来更新“新数据”,因为新数据中包括了拿当前这个物品的状态,而当前这个物品是可以被拿无数次的,最后输出dp[V]即可。

(3)二维费用背包模型

有一个体积为V的背包,商店有n种物品,每种物品有一个价值v、体积w、重量m,每种物品仅有1个,问能够装下物品的最大价值。

dp[i] [j]表示当前体积为i,重量为j的情况下所能拿的物品的最大价值。

状态转移方程为:dp[i] [j] = max(dp[i] [j],dp[i - w] [j - m] + v)

(4)分组背包模型

有一个体积为V的背包,商店有n组物品,每组物品有若干个价值v、体积w,每组物品中至多选1个,问能够装箱物品的最大价值。

设状态dp[i] [j]表示到第i组,体积为j的最大价值,在这里不能忽略第一维,否则可能导致状态转移错误!

状态转移方程为:dp[i] [j] = max(dp[i - 1],dp[j - w] + v)

你可能感兴趣的:(蓝桥杯C++,蓝桥杯,笔记,职场和发展)