背包问题 笔记

背包问题

背包问题是「动态规划」中十分经典的一类问题,背包问题本质上属于组合优化的「 NP 完全问题」。 只能通过 「穷举」+「验证」 的方式进行求解。

「背包问题」 泛指一类「给定价值与成本」,同时「限定决策规则」,如何实现价值最大化的问题。

一、01 背包

「01背包」 是指给定物品价值与体积(「给定价值与成本」),在规定容量下(「限定决策规则」)如何使得所选物品的总价值最大。

有 N 物品和一个容量是 W 的背包,每种物品只有 一件。第 i 件物品的体积是 w[i],价值是 v[i]。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

1、状态定义

dp[][] 二维数组,其中一维代表 「当前枚举到哪件物品」,另外一维 「现在剩余容量」,数组装的是「最大价值」。
考虑前 i 件物品,使用容量不超过 j 的条件下的背包最大价值。

对于第 i 件物品,有「选」和「不选」两种决策。

「不选」dp[i - 1][j] 等效于只考虑前 i - 1 件物品,当前容量为 j 的情况下的最大价值。
选第 i 件物品的话,需要消耗 w[i] 的背包容量,获取 v[i] 的价值,那么前 i - 1 件物品的背包容量就只有 j - w[i],即最大价值为 dp[i - 1][j - w[i]] &#

你可能感兴趣的:(常用算法,java)